2015-04-02 64 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