【问题标题】:How to escape a delimiter by doubling the delimiter in a regex如何通过在正则表达式中加倍分隔符来转义分隔符
【发布时间】:2015-08-14 07:12:50
【问题描述】:

我需要在分隔符上拆分字符串,但不是在分隔符加倍的地方。

例如"\m55.\m207|DEFAULT||DEFAULT|55||207"一旦分裂应该导致

  • \m55.\m207
  • 默认||默认
  • 55||207

我正在尝试使用正则表达式来做到这一点。如果有什么不同,我使用 C# System.Text.RegularExpression.Regex

到目前为止,我有 "[^|]\|[^|]" 但这并不能处理转义分隔符在分隔符旁边的位置。即|||

我确信网上有解决方案,但我尝试使用多个不同的术语进行搜索,但找不到合适的术语组合来找到它。

如何通过在正则表达式中加倍分隔符来逃避分隔符?或者如果有更简单的解决方案是什么?

编辑

这是一个更复杂的例子:

输入:“\m55.\m207|DEFAULT||DEFAULT|||55||207” 预期输出:

  • "\m55.\m207"
  • “默认||默认||”
  • “55||207”

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    因为你的demo很简单,你只想用单个|拆分,所以我可以在这里使用\b

    string txt = @"\m55.\m207|DEFAULT||DEFAULT|55||207";
    string patten = @"\b\|\b";
    foreach (var str in Regex.Split(txt, patten))
    {
        Console.WriteLine(str);
    }
    

    【讨论】:

    • 这失败,双精度后跟一个分隔符。
    【解决方案2】:
    (?<=[^|](?:\|{2})+)\|(?!\|)|(?<!\|)\|(?!\|)
    

    您需要使用lookarounds 以确保仅在一个| 上发生拆分。

    See Demo

    【讨论】:

    • 不,它没有。演示中第二个示例中的第二个匹配与所有 3 个 ||| 匹配不只是最后一个|。
    • 并不像它想象的那么完美||||是 |||后跟一个分隔符,但足够接近。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多