2014-09-25 63 views
0

我有一个正则表达式,它分析驱动程序inf文件中的行以仅提取忽略以分号开头的空格和行尾注释的变量名称和值。正则表达式似乎忽略制表符

它看起来像这样:

"^([^=\s]+)[ ]*=[ ]*([^;\r\n]+)(?<!)" 

大多数时候,它只是罚款按这里的例子:regex example 1

然而,当遇到有一个制表符之间的任何一条线变量名称和等号,表达式按照这里的示例失败:regex example 2

我试图用“\ t”和“\ x09”替换“\ s”,它仍然不起作用。我用十六进制编辑器编辑了包含制表符的文本文件,并确认它确实是ASCII“09”。我不想使用积极的字符匹配,因为变量实际上可能包含相当多的特殊字符。

文字“=”的外观似乎导致了问题,但我不明白为什么。 例如,如果我将表达式去掉:regex example 3

并使用带有制表符的行,它工作正常。但是,只要我按照这里的例子添加文字“=”:regex example 4,它不再匹配,看起来忽略了制表符。

回答

1

这两个[ ]*只匹配空格字符(U+0020 SPACE)而不匹配其他空格字符。 将两者都更改为[ \t]*以匹配标签。结果现在看起来像:

"^([^=\s]+)[ \t]*=[ \t]*([^;\r\n]+)(?<!)" 
+0

即固定它,但对于不同的东西我试图 “^([^ \ S] +)=” 在第一部分和它不工作。我认为“^([^ \ s] +)=”意思是“从字符串的开头开始,匹配所有不是空格的东西,直到找到字符”=“”? – Lembasts 2014-09-26 01:18:29

+0

@Lembasts'^([^ \ s] +)''这不会工作因为'='有'空间'。所以没有任何东西可以消耗空间,因为你拒绝空间消耗。所以它不会工作。 – vks 2014-09-26 05:25:40

0

你刚加入的\t制表符在错误的部分,我想。

这是你的榜样2(不工作):

^([^=\s]+)[ ]*=[ ]*([^;\r\n]+)(?<!) 

这就是你们的榜样2 ...工作(有标签):

^([^=\s]+)[ \t]*=[ ]*([^;\r\n]+)(?<!) 
      ^^ tab here 

似乎这样的伎俩和匹配你的第一个例子:http://regex101.com/r/kQ1zH4/1