2016-12-03 30 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