2012-08-14 42 views
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)与情况1和2相同的情况;但是,在没有#号的地方(请参阅上面有关尾部空白的说明)。例如

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 

回答

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

意味着比赛

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

OR

(?:.*) 

试试这个

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

虽然(?:.*)似乎一种毫无意义的,你为什么不尝试这样的事情,而不是:

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

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

+0

我同意'(?:。*)似乎毫无意义,我只是不知道该如何表达。我尝试了两种解决方案,但他们不适合我。它们包括'Hello World'组中'#Some more text'部分。我需要它不包括尾随空间,英镑符号和其后的所有内容。 – TehTechGuy 2012-08-14 16:58:52

+0

这与(。+ \ S)的贪婪行为有关,尝试将它改为懒惰的替代方案,(。+?\ S),这也应该做窍门 – 2012-08-14 17:03:47

+0

也不需要一个字符类只有一件事:S – 2012-08-14 17:04:20

2

我怀疑你正在使这比它需要更困难。试试这个正则表达式:

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

我用[ \t]+代替\s+,以防止它匹配换行符和溢出到下一行 - 假设输入还真是多,当然。你仍然可以将它应用到独立的字符串,如果这是你喜欢的。

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

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

随着第一个正则表达式我试图避免做出限制的假设和我有点忘乎所以。如果您可以对所有单词使用\w+,则会变得更容易,如您所见。

+0

这个的实际目的是解析出一个配置文件,其中'#'符号被用作注释字符。您的解决方案适用于部分测试案例,但不是全部。它适用于我作为示例发布的两个字符串,但它不适用于“Test = Hello_World#更多文本”或任何在第二个捕获组部分中没有空格的情况。 我修改了你的解决方案到'^(\ w +)=([^#] +(?:[^ \ s#] +)+)',这似乎按照需要工作。不知道它是否是最正确的版本,但它能完成这项工作:)谢谢! – TehTechGuy 2012-08-14 23:20:17

+0

试试刚添加到我的答案中的正则表达式。 – 2012-08-15 01:38:50

+0

如果字符串中存在句点,例如字符串“Test = Hello.World#Some some text”,那么这个句柄就不起作用。第二个捕获组将返回“你好”。第一个捕获组必须是“=”之前的所有内容,而第二个捕获组必须是“#”或“#”之间的所有内容,后者仅用于诸如“Test = Hello World#Some more text”之类的字符串。 。如果第一个字符是“#”,则正则表达式也不会返回任何内容。 – TehTechGuy 2012-08-15 02:31:57