【问题标题】:Regex to parse string between two markers without capture groups and excluding markers正则表达式解析两个标记之间的字符串,没有捕获组和排除标记
【发布时间】:2019-04-04 03:10:00
【问题描述】:

用这样的字符串集合:

string s1 = "   Identifier1 = Value1                      ## Comment";
string s2 = "   Something = SomeData";
string s3 = "   Name = information\\t\\t\\t## More comments!";
string s4 = "   Nam2 = information";

我需要一个正则表达式模式,该模式将抓取等号 (=) 之后直到行尾或 ## 注释标记的行上的所有信息,但不会捕获其中任何一个。

给我(分别):

" Value1                      "
" SomeData"
" information\\t\\t\\t"
" information"

到目前为止,我已经想出了这个:(?<=[=]).+(?=(?>##|$))

它有点工作,因为它设法抓取 = 符号之后的所有文本直到字符串的末尾,但是当有注释标记时它永远不会工作:## 因为它仍然抓取到字符串的末尾,而不是停在##。

...如果我将模式更改为:(?<=[=]).+(?=##))

然后它在带有注释标记的行上工作(并根据需要在它们之前停止)。

那么我做错了什么/错过了让它在 ## 之前或 EOL 结束捕获?另外,我不能使用显式或隐式捕获组,因为这些模式被传递到解析器中,解析器在处理它们时会将它们转换为非捕获组。

直到最近几天,我才使用过前瞻/后视模式,这东西让我大吃一惊……

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    你可以使用这个正则表达式(如使用here所见):

    (?<==)(?:(?!#{2}).)*
    
    • (?&lt;==)lookbehind 确保前面的内容匹配 = 字面意思
    • (?:(?!#{2}).)* 匹配任何字符(不包括换行符)任意次数,直到达到 ##

    【讨论】:

    • 好吧,好吧,它确实有效!虽然我仍在努力弄清楚如何/为什么! (另外,谢谢你的链接!现在我知道它叫什么了,我实际上正在寻找关于它的帮助参考。在不知道这个词的情况下,我完全在试图寻找一个 sol'n 时碰壁!)
    【解决方案2】:

    你可以使用这个正则表达式,

    (?<==).*?(?=#{2}|$)
    

    说明:

    • (?&lt;==) - 积极向后看以确保匹配的文本前面是=
    • .*? - 以非贪婪方式匹配任何文本
    • (?=#{2}|$) - 积极向前看以确保匹配的文本后跟## 或行尾$

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-29
      • 2019-11-19
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多