假設我有一個像字符串(...)aaabaacaaaaaXaaaadaeaa
(...)更長的字符串,我想匹配或替換aaabaacaaaaa
與X
作爲分隔符。何時選擇[^ x] *或。*?
我現在可以使用(。*?)X查找X
之前的字符串,或者我可以使用([^ X] *)來查找它。我也可以使用負面預測,但我認爲在這種情況下是不必要的。 那麼這兩個(或三個)選項中哪一個是更好的技術來獲得我想在這種情況下匹配的組?
假設我有一個像字符串(...)aaabaacaaaaaXaaaadaeaa
(...)更長的字符串,我想匹配或替換aaabaacaaaaa
與X
作爲分隔符。何時選擇[^ x] *或。*?
我現在可以使用(。*?)X查找X
之前的字符串,或者我可以使用([^ X] *)來查找它。我也可以使用負面預測,但我認爲在這種情況下是不必要的。 那麼這兩個(或三個)選項中哪一個是更好的技術來獲得我想在這種情況下匹配的組?
拿這個很簡單的例子:
www\..*?\.com
www\.[^.]*\.com
第一個包含www.
利用兩者任何一個.com
任何輸入相匹配。第二個匹配www.
和.com
,中間沒有.
。
第一個匹配:www.google.something.com
第二個不會。
如果該部分絕對不能包含字符,則只能使用否定類。
在你的例子中,我會想象它完全取決於個人偏好。請記住,這兩個不相同。 – OGHaza
爲什麼'?'在第一個例子中?起初,你告訴RE匹配任何數量的。 (任何字符)'*'然後你通過'?'來告訴它只匹配0或1個重複。 – Schnodderbalken
@Schnodderbalken'?'不代表0或1.它是一個修飾符(或者其他所謂的),它使''*'非貪婪。 – SuperSaiyan
.*?
被稱爲惰性量詞。[^X]*
稱爲貪婪否定量詞只要有可能使用否定即[^X]
,因爲它不會引起回溯。 Ofcourse如果輸入文本可以包含字母X
那麼你沒有選擇,只能使用.*?
我複製本文從最近的評論之一來自@ridgerunner:
表達:
[^X)]*
肯定是更除了可能的Perl(其正則表達式引擎高度優化的 )之外,每種語言都可以使用效率高於.*?
的。表達式.*?
必須 在每個字符位置停止和回溯一次,因爲它是「顛簸」,而應用於否定 字符類表達式的貪婪量詞可以消耗單個 步驟中的整個塊,而不會回溯。
爲什麼你認爲regexp是解決方案? –
+1,我總是有這個問題,我傾向於傾向於[^ X] *'。 – SuperSaiyan
使用具有貪婪量詞的否定字符類比具有惰性量詞的點更有效。 –