0

用琴弦

Test=Hello World #Some more text
Test=Hello World

我需要同时捕获“测试”组和“Hello World”组。如果字符串以“#”开头,则根本不应该被捕获。

以下表达式分别适用于第一个和第二个字符串:

^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])
^((?!#).+)(?:=)(.+[\S])

如何在两个非捕获正则表达式组之间进行按位逻辑或?

我试着做类似的事情

^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])|(?:.*)

但不能让它正常工作。

更多细节

背景:这是在 C# (.NET Framework 4.0) 中完成的。正在逐行读取文件。等号左边的文本是指变量名,等号右边的文本是指变量的值。该文件被用作配置文件。

一般情况:

注意:所有尾随空格 - 不应捕获最后一个非空格字符末尾的任何空格。这还包括第二组末尾和井号之间的任何空格。

1) 除空格外的所有字符,紧随其后的是等号,紧随其后的是任何一组字符,后跟空格和井号。例如

this=is valid #text
s0_is=this #text
and=th.is #text
the=characters after the    # Pound sign are irrelevant

2) 与案例 1 完全相同的情况,只是第二个捕获组和井号之间没有尾随空格。例如

this=is valid#text
s0_is=this#text
and=th.is#text
the=characters after the# Pound sign are irrelevant

3) 情况与情况一、二相同;但是,如果根本没有 # 符号(请参阅上面关于尾随空格的说明)。例如

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
4

2 回答 2

2

我怀疑你让这变得比它需要的更困难。试试这个正则表达式:

^(\w+)=([^\s#]+(?:[ \t]+[^\s#]+)+)

我使用[ \t]+而不是\s+防止它与换行符匹配并溢出到下一行——当然,假设输入确实是多行的。如果您愿意,您仍然可以将其应用于独立字符串。

编辑:回答你的评论,试试这个正则表达式:

^(\w+)=(\w+(?:[ \t]+\w+)*)

使用第一个正则表达式时,我试图避免做出限制性假设,但我有点得意忘形。\w+如您所见,如果您可以使用所有单词,它会变得容易得多。

于 2012-08-14T19:38:35.837 回答
1
^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])|(?:.*)

表示匹配

^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])

或者

(?:.*)

尝试这个

^((?!#).+)(?:=)(.+[\S])(?:(?:[\s]*[#])|(?:.*))

虽然(?:.*)看起来有点毫无意义,但你为什么不尝试这样的事情:

^((?!#).+)(?:=)(.+?\S)(?:\s*[#])?

这将有选择地匹配最后一组,这是我认为你正在尝试做的事情,在这种情况下这将是更好的选择。

于 2012-08-14T16:05:00.393 回答