2010-12-14 29 views
1

我可能需要一些關於正則表達式的問題的一些幫助,並希望提前感謝任何幫助。正則表達式來分割一個字符串,但考慮多位數轉義序列

我必須用另一個字符串分割一個字符串,我把它稱爲分隔符。但是,如果轉義序列優先於separatorString,則此時不應該拆分字符串。轉義序列也是一個字符串,讓我叫它escapeSequence

也許是最好先從一些例子

separatorString = "§§"; 

escapeSequence = "###"; 

inputString = "Part1§§Part2" ==> Desired output: "Part1", "Part2" 
inputString = "Part1§§Part2§§ThisIs###§§AllPart3" ==> Desired output: "Part1", "Part2", "ThisIs###§§AllPart3" 

搜索計算器,我發現Splitting a string that has escape sequence using regular expression in Java和正則表達式

"(?<!(###))§§"上來。

這基本上是說,如果找到「§§」,匹配,除非它前面有「###」。

這正常工作與Regex.Split對於上面的例子,但是,如果inputString是"Part1###§§§§Part2"我收到"Part1###§", "§Part2",而不是"Part1###§§", "Part2"

我明白爲什麼,因爲後面的字符是「##§」而不是「###」,因爲第二個「§」給出匹配。我嘗試了幾個小時來修改正則表達式,但結果變得更糟。有人有想法嗎?

回答

1

我們來看看分隔符之間出現的東西,標記。你的正則表達式需要規定一個令牌的開始和結束是什麼樣的。

在沒有任何約定的,換句話說,使用你現在正則表達式,正則表達式引擎是高興地說,第一個標記是Part1###§,第二個是§Part2

您使用的語法(?<!foo)被稱爲零寬度負面後顧斷言。換句話說,它看起來落後於當前的比賽,並且斷言它必須匹配foo。零寬度僅表示斷言在評估斷言時不會使主體字符串中的指針或光標向前移動。

如果您需要新的令牌以特定的事物(例如字母數字字符)開頭,那麼您可以使用零寬度正向超前斷言來指定該令牌。它與你的lookbehind類似,但它表示「下一位必須與下面的模式匹配」,同樣不需要前進光標或指針。

要使用它,請在§§之後加(?=[A-Z])。分隔符的整個正則表達式是
(?<!###)§§(?=[A-z])

這會斷言分隔符序列後面的字符需要是大寫字母,而分隔符序列前面的字符不能是###。在你的例子中,它會強制§§分隔符處的匹配成爲Part2之前的一對字符。那麼你會得到Part1###§§Part2作爲標記或組捕獲。

如果你想規定一個令牌是否定的 - 換句話說,要規定一個令牌以任何東西開頭,除了以外的某種模式,你可以使用負向前瞻斷言。這個語法是(?!foo)。它的工作方式與您所期望的一樣 - 就像您的負面看法,只是向前看。

regular-expressions.info website對於所有的正則表達式都有很好的解釋,包括for the lookahead and lookbehind constructs

ps:它是「你好,所有」,而不是「你好,一起」。

+0

哇,非常感謝您提供的快速回答和解釋。你的答案可能會訣竅,雖然我不太確定它是否能夠應付這樣的問題:「Part1 ###§§§§§§」。我可能需要像這樣的結果「Part1 ###§§,」「」,「但是我需要一些日子才能回到這個問題,但我會,再見所有;) – user541727 2010-12-14 17:52:51

+0

取決於你的意思是」應對「,你可能希望讓$$成爲先前令牌的一部分,或者你可能希望$$$$表示一個空的令牌,我所提出的建議規定令牌以大寫的字母數字開頭,如果你有不同的規定,那麼你將不得不使用不同的正則表達式 – Cheeso 2010-12-14 18:23:38

+0

'(?<!###)§§'的問題是它會匹配'###§§§'中的最後兩個字符。使用'(###§§|。)*'之類的東西更加穩固,或者,如果你可能用'###'來逃避其他角色,你可以使用'(###。{2} |。)。 *'。 – eyelidlessness 2010-12-14 18:57:08

0

如何做相反:在分離器而不是分裂的字符串相匹配的非分離的部分和分離部分組成:

/(?:[^§#]|§[^§#]|#(?:[^#]|#(?:[^#]|#§§)))+|§§/ 

然後你只需要刪除每個匹配的分離部分,以獲得非分離部分。

+0

也非常感謝Gumbo。如上所述,我會嘗試您的解決方案並在幾天內給出反饋。 – user541727 2010-12-14 17:55:34

相關問題