2015-11-29 45 views
0

我試圖在正則表達式中匹配並捕獲任何包含「球」但沒有在其前面的「腳」或「籃子」的單詞。例如,我想匹配「排球」和「躲避球」,但不是「籃球」或「足球」。 重要的是我不能使用一個積極的組,但一個消極的組。 我的嘗試:正則表達式否定組

[^(?:foot|basket)(ball)] 

!(?:foot|basket)(ball) 

發現對面是相當簡單:

(?:foot|basket)(ball) 

,但是這不是我要找的。我需要另一種方式。

編輯:這是PHP,這是一個「preg_replace」命令。

+0

有一個以上的正則表達式的語法。你不能只是提出一個關於「正則表達式」的問題,而不會描述它使用的語言或庫。 PCRE(如果是這樣,Perl的實現?Python的?Java的?)? BRE? ERE? RE2? –

+1

你正在尋找所謂的「負面後顧」,在大多數RE引擎中(JavaScript不支持它)是'(?<!....)'。 – Kenney

+0

@Charles我不明白爲什麼回溯必須參與實施;在解析輸入字符串時,可以在正則表達式開始時針對負向後置表達式進行檢查。如果匹配,則正則表達式失敗。 – Kenney

回答

3

PHP使用PCREs。因此,負回顧後語法可用:

(?<!foot|basket)ball 
0

我會隔離所有子的ball,然後執行無足或籃筐後面。

\b(?:(?!ball)\w)*(?:(?<!foot)(?<!basket)ball(?:(?!ball)\w)*)+\b
或者,我覺得PCRE可以做斷言這樣
\b(?:(?!ball)\w)*(?:(?<!foot|basket)ball(?:(?!ball)\w)*)+\b

格式化:

\b 
(?: 
     (?! ball) 
     \w 
)* 
(?: 
     (?<! foot) 
     (?<! basket) 
     ball 
     (?: 
      (?! ball) 
      \w 
    )* 
)+ 
\b 
+0

有趣。 但爲什麼?這有什麼好處? –

+0

@john_black - 優勢在哪?這個「(?!!!)球」?首先,它匹配_tring_子字符串,另一個匹配_ball_。其次,它會檢查整個單詞是否出現所有子字符串_ball_。令人驚訝的是,SO是另一個答案得到3個讚揚的地方(也許並不意外)。 – sln