正则表达式解析配置文件,其中#符号表示注释

时间:2012-08-14 15:28:17

标签: regex

使用字符串

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

2 个答案:

答案 0 :(得分:2)

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

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

我使用[ \t]+代替\s+来阻止它与新行匹配并溢出到下一行 - 当然,假设输入确实是多行的。如果你喜欢这样,你仍然可以将它应用于独立字符串。

编辑:在回答您的评论时,请尝试使用此正则表达式:

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

对于第一个正则表达式,我试图避免限制假设,我得到了一点点。如果您可以使用\w+表示所有单词,就会更容易,正如您所见。

答案 1 :(得分:1)

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

表示匹配

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

OR

(?:.*)

试试这个

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

尽管(?:.*)似乎毫无意义,但为什么不尝试这样的事情呢?

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

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