2014-09-25 61 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