2016-12-03 33 views
4

我想有一個表達,其中下一個符號發現值之後不「(」正則表達式表達和下一個符號不是「(」

我有以下基正則表達式:

(([_A-Za-z]([_\w])+)|([A-Za-z])) 

和文字,例如:

a3+red+42+_dv+Sy(w12+44) 

祝正則表達式應該返回:

a3, red, _dv, w12 

此基礎上正則表達式返回

a3, red, _dv, Sy, w12 

,但我需要排除 'SY',因爲下一個符號是 「(」。

我嘗試以下方法:

(([_A-Za-z]([_\w])+)|([A-Za-z]))(\b) 

但它返回

a3+, red+, _dv+, w12) 

我並不需要有一個符號,我需要包括只有在接下來的符號不是「(」

+2

否定預測 – m0meni

回答

4

您需要做三件事:

  • 括在的原子團的圖案(或至少您的交替的第一部分,它包含一個量詞)

  • 開始一個字邊界的圖案(用於快速避免無用的位置)

  • 使用前瞻斷言來測試下一個字符,如果任何

結果:

\b((?>[_A-Za-z]\w+)|[A-Za-z]\b)(?!\() 

寶int 1對於在這種情況下阻止回溯機制很重要:Abcd(沒有它,模式將成功並返回Abc。使用原子組,該模式將與Abcd匹配,並且由於它不能返回,因此它將在下一個字符時失敗。

其他寫模式的方法:

\b(?>[A-Za-z]\w*|_\w+)(?!\() 
+0

謝謝,但它從'Sy'(符合S)中獲得一個符號。如何排除它呢? –

+0

@casimir小的語法抱怨:「我的第一部分交替」,我很樂意編輯,但它低於必需的最小字符數。 –

+1

@DavidMetcalfe:謝謝,它已被糾正。 –

1

如果你不希望在你輸入一個_這個怎麼樣的正則表達式:

\b[^\W\d]\w*+(?!\() 

See demo at regex101

+*quantifier使得possessive以防止超前回溯。
相反,您可以使用另一個字邊界\bsee another demo at regex101)。

+0

不代表[0-9]? – ErikE

+0

@ErikE當然,'\ d'是* digit *'[0-9]'的[short](http://www.regular-expressions.info/shorthand.html)。如果你的意思是'[^ \ W \ d]'在否定詞類中被否定,那麼'\ w'就從'\ w'中減去,從而留下'[_a-zA-Z]'。在這裏[閱讀更多關於這樣的結構](:http://www.rexegg.com/regex-interesting-character-classes.html#obnoxious)(: –

+0

我現在明白了,但我認爲保存2個字符的代價是失去清晰度是一個愚蠢的事情。 – ErikE