2014-02-27 162 views
1

有一些需要注意的使用與分裂操作分組?正則表達式分裂與分組

在perl的:

print join("|",split(m/(A|AND)/,"foo A bar"))."\n"; 

預期:

foo | bar 

輸出:用於Powershell的

foo |A| bar 

同預期的/輸出:

([regex]::Split("foo A bar","(A|AND)"))-join"|" 

好像使用分組時,問題就出現了 - 沒有括號一切都很好:如預期

([regex]::Split("foo A bar","A|B"))-join"|" 

輸出:

foo | bar 

但是,當我介紹的分組,以便能夠使用多字符交替(用填充字符環繞 - 「\ S(A | AND)\ S」),分割出現行爲異常。

什麼是分裂實際上是在這裏做 - 正在執行什麼樣的分裂?爲什麼我可能期望沒有執行分割?我有什麼選擇?

+0

是的,捕獲組產生所捕獲的數據的陣列中的一個元件。使用'(?:A | B)'來清除分隔符。擁有這個能力雖然是非常強大的。例如,你可以同時過濾和分割。 – sln

回答

4

使用非捕獲括號分割的正則表達式,(?:..)

print join("|",split(m/(?:A|AND)/,"foo A bar"))."\n"; 

perldoc

如果該圖案包含捕獲組,則對於每個分離器,一個附加的字段中產生用於捕獲的每個子由一組(在其中基團被指定,按照反向引用的順序);如果任何組不匹配,則捕獲undef值而不是子字符串。

PowerShell(或更確切地說.Net)也是如此。從documentation

如果捕獲括號在一個Regex.Split表達所使用的,任何捕獲文本被包括在生成的字符串數組英寸例如,如果在放置捕獲括號內的連字符分割字符串「梅花梨」,返回的數組包括包含連字符的字符串的元素。

+0

謝謝!我不敢相信我不知道非捕獲括號! – Yevgeniy