2013-11-26 24 views
2

假設我有一個像字符串(...)aaabaacaaaaaXaaaadaeaa(...)更長的字符串,我想匹配或替換aaabaacaaaaaX作爲分隔符。何時選擇[^ x] *或。*?

我現在可以使用(。*?)X查找X之前的字符串,或者我可以使用([^ X] *)來查找它。我也可以使用負面預測,但我認爲在這種情況下是不必要的。 那麼這兩個(或三個)選項中哪一個是更好的技術來獲得我想在這種情況下匹配的組?

+0

爲什麼你認爲regexp是解決方案? –

+0

+1,我總是有這個問題,我傾向於傾向於[^ X] *'。 – SuperSaiyan

+0

使用具有貪婪量詞的否定字符類比具有惰性量詞的點更有效。 –

回答

2

拿這個很簡單的例子:

www\..*?\.com 
www\.[^.]*\.com 

第一個包含www.利用兩者任何一個.com任何輸入相匹配。第二個匹配www..com,中間沒有.

第一個匹配:www.google.something.com 第二個不會。

如果該部分絕對不能包含字符,則只能使用否定類。

+0

在你的例子中,我會想象它完全取決於個人偏好。請記住,這兩個不相同。 – OGHaza

+0

爲什麼'?'在第一個例子中?起初,你告訴RE匹配任何數量的。 (任何字符)'*'然後你通過'?'來告訴它只匹配0或1個重複。 – Schnodderbalken

+0

@Schnodderbalken'?'不代表0或1.它是一個修飾符(或者其他所謂的),它使''*'非貪婪。 – SuperSaiyan

2
  • .*?被稱爲惰性量詞。
  • [^X]*稱爲貪婪否定量詞

只要有可能使用否定即[^X],因爲它不會引起回溯。 Ofcourse如果輸入文本可以包含字母X那麼你沒有選擇,只能使用.*?

我複製本文從最近的評論之一來自@ridgerunner:

表達:[^X)]*肯定是更除了可能的Perl(其正則表達式引擎高度優化的 )之外,每種語言都可以使用效率高於.*?的。表達式.*?必須 在每個字符位置停止和回溯一次,因爲它是「顛簸」,而應用於否定 字符類表達式的貪婪量詞可以消耗單個 步驟中的整個塊,而不會回溯。