正则表达式似乎忽略制表符

时间:2014-09-25 23:18:24

标签: regex

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

看起来像这样:

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

大多数情况下,根据此处的示例,它的工作正常:regex example 1

但是,当遇到变量名和等号之间任意位置的制表符时,表达式会失败,如下例所示:regex example 2

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

文字“=”的出现似乎引起了问题,但我无法理解为什么。 例如,如果我将表达式剥离为:regex example 3

并使用带有制表符的行,它工作正常。但是,只要按照此示例添加文字“=”:regex example 4,它就不再匹配,似乎忽略了制表符。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您刚刚在我认为的错误部分添加了\t标签字符。

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

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

这是你的例子2 ......工作(带标签):

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

似乎要做的诀窍并匹配你的第一个例子:http://regex101.com/r/kQ1zH4/1

答案 2 :(得分:0)

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

试试这个。看演示。

http://regex101.com/r/tV8oH3/2