2012-08-14 33 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