使用字符串
Test=Hello World #Some more text
Test=Hello World
我需要捕获“测试”组和“Hello World”组。如果字符串以“#”开头,则根本不应该捕获它。
以下表达式分别适用于第一个和第二个字符串:
^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])
^((?!#).+)(?:=)(.+[\S])
如何在两个非捕获的Regex组之间进行按位逻辑OR?
我尝试过像
这样的事情^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])|(?:.*)
但无法让它正常运作。
更多详情
背景:这是在C#(.NET Framework 4.0)中完成的。正在逐行读取文件。均衡符号左侧的文本是指变量名称,均衡符号右侧的文本是指变量的值。该文件用作配置文件。
一般情况:
注意:所有尾随空格 - 不应捕获最后一个非空白字符结尾之后的任何空格。这还包括第二组末尾和井号之间的任何空格。
1)除了空白之外的所有字符,紧接着是一个均衡符号,紧接着是任意一组字符,后跟一个空格和一个英镑符号。 e.g。
this=is valid #text
s0_is=this #text
and=th.is #text
the=characters after the # Pound sign are irrelevant
2)与案例1完全相同的情况,除了第二个捕获组和井号之间没有尾随空格。 e.g。
this=is valid#text
s0_is=this#text
and=th.is#text
the=characters after the# Pound sign are irrelevant
3)与案例一和二案件相同的情况;但是,根本没有#符号(请参阅上面关于尾随空格的说明)。 e.g。
this=is valid
s0_is=this
and=th.is
the=characters after the
对于所有这三种情况,捕获组应分别如下所示(|符号用于区分捕获组):
this|is valid
s0_is|this
and|th.is
the|characters after the
特殊情况:
1)该行的第一个字符是#符号。这应该导致没有被捕获。
2)#符号后面会出现#符号。这应该导致第二个捕获组为空。
3)#符号出现在上面没有明确说明的任何地方。这应该导致没有被捕获。
4)新行的第一个字符前面不应有空格;但是,这种情况不太可能实际发生。
5)均衡符号后面的空格无效。
无效的情况(不应捕获任何内容):
th is=is not valid#text
nor =this#text
or_this=something
also= this
答案 0 :(得分:2)
我怀疑你让它变得比它需要的更难。试试这个正则表达式:
^(\w+)=([^\s#]+(?:[ \t]+[^\s#]+)+)
我使用[ \t]+
代替\s+
来阻止它与新行匹配并溢出到下一行 - 当然,假设输入确实是多行的。如果你喜欢这样,你仍然可以将它应用于独立字符串。
编辑:在回答您的评论时,请尝试使用此正则表达式:
^(\w+)=(\w+(?:[ \t]+\w+)*)
对于第一个正则表达式,我试图避免限制假设,我得到了一点点。如果您可以使用\w+
表示所有单词,就会更容易,正如您所见。
答案 1 :(得分:1)
^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])|(?:.*)
表示匹配
^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])
OR
(?:.*)
试试这个
^((?!#).+)(?:=)(.+[\S])(?:(?:[\s]*[#])|(?:.*))
尽管(?:.*)
似乎毫无意义,但为什么不尝试这样的事情呢?
^((?!#).+)(?:=)(.+?\S)(?:\s*[#])?
将可选地匹配最后一个组,这是我认为你正在尝试做的,在这种情况下它将是更好的选择。