2015-04-02 63 views
0
/(?![a-z])(\s|\d|)(cos|sin|tan|ln)(\s|\(|\\left)/ 

这种模式不会在这个字符串首先匹配 “COS”:模式不匹配第一 “COS”

cos azertcos sin(tan xxx cos cos\left tan 

见: https://regex101.com/r/mB4uZ5/2

任何想法?

+3

的''在开始时防止第一“COS “从被匹配。 – Default 2015-04-02 16:00:20

+0

'(?![a-z])是不是表示第一个字符不能是'a-z'? – 2015-04-02 16:00:57

回答

4

随着(?![a-z])你介绍一个负向前查找正则表达式,这意味着:

匹配的,所以如果你添加一个空格你的字符串会工作部分,可以不是以小写字母开头。所以不可能匹配第一个cos。

它匹配的cos因为它捕获空间以及(满足负先行)。

你可能想要的是一个字屏障\b):

/\b(cos|sin|tan|ln)(\s|\(|\\left)/ 

demo

\b与任何非单词匹配(\W,但没有捕捉),或将开始字符串(^)。如果你想允许放置位在前方以及(如4cos(2)),你可以例如使用:(?![AZ])

/\b(\d*)(cos|sin|tan|ln)(\s|\(|\\left)/ 
+0

太棒了!谢谢 – me987654323 2015-04-02 16:07:37

+0

这就是说,如果你打算写一个数学解析器,你应该使用上下文无关文法(a * compiler-compiler *)。这将使解析方式更容易,更不容易出错。 – 2015-04-02 16:15:27

1

你的正则表达式期待本场比赛的第一个字符是一个非a-z因为(?![a-z]),并且是空白或数字,因为(\s|\d|)

cos azertcos sin(tan xxx cos cos\left tan 

或者你可以摆脱(?![a-z])(\s|\d|)

+0

我认为OP引入了它来获得'foocos'和其他调用的红色。 – 2015-04-02 16:04:20

+0

我不会建议领先空间。它更像是一种黑客攻击,并且使得'(!![a-z])'是多余的。 – 2015-04-02 16:04:26

+0

@ʰᵈˑ同意,但我不确定OP真正想做什么,所以我只是抛出选项 – 2015-04-02 16:06:02