2012-06-03 70 views
3

我花了像三個小時試圖understant如何"(?<!^)(?=[A-Z])"工作根據大寫字母在特林拆分,即正則表達式 「(?<!^)(?= [AZ])」

string[] s = Regex.Split("TheWorldWithoutStrangers", "(?<!^)(?=[A-Z])"); 

如何這行得通 !!我明白上述表達式中每個字符的含義是什麼,但我不明白它是如何一起工作的。爲什麼"(? < !^)([A-Z])"不工作?這意味着只要你找到一個不是在新行後面的字母,然後拆分,我是對的嗎?

+0

你究竟想要做什麼? – Shai

+2

閱讀有關正則表達式[Lookbehind and Lookahead](http://www.codeproject.com/Articles/9099/The-30-Minute-Regex-Tutorial)。 – SimpleVar

+0

我想要數組s有值 {The, 世界, 沒有, 陌生人} – Emo

回答

2

這裏的關鍵是(?<!...)(?=...)這兩個部分是零寬度斷言。第一個確保^(字符串的開頭)不會發生在匹配位置之前,第二個確保[A-Z](單個大寫字母)出現在匹配位置之後。實際的匹配是空的,因爲這兩個斷言都不匹配任何字符。整個表達式僅僅匹配一個位置。

4

^表示一行的開始,而(?<!...)是一個負面的後面,所以(?<!^)匹配任何位置在該行的開頭不正確的字符串。

該集合[A-Z]匹配任何大寫字母,(?=...)是一個積極的展望,所以(?=[A-Z])匹配大寫字母前的字符串中的任何位置。

將它們放在一起,並且表達式匹配字符串中任何不正確的位置,並且在大寫字母之前。

+0

「(?<!^)([A-Z])」或「(?<!^)[A-Z]」爲什麼不起作用? – Emo

+0

您必須確保正則表達式中的任何內容都不會匹配字符串中的子字符串,因爲匹配部分已從輸出中移除。 – JohnB

+1

@imad:這將包括比賽中的大寫字母。僅使用後面的觀察和前瞻使得表達式匹配大寫字母和之前的字符之間的位置。由於匹配長度爲零,拆分不會從字符串中刪除任何內容,並且結果包含原始字符串中的所有字符。 – Guffa

相關問題