/(?![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
任何想法?
/(?![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
任何想法?
隨着(?![a-z])
你介紹一個負向前查找正則表達式,這意味着:
匹配的,所以如果你添加一個空格你的字符串會工作部分,可以不是以小寫字母開頭。所以不可能匹配第一個cos。
它匹配的下cos
因爲它捕獲空間以及(滿足負先行)。
你可能想要的是一個字屏障(\b
):
/\b(cos|sin|tan|ln)(\s|\(|\\left)/
\b
與任何非單詞匹配(\W
,但沒有捕捉),或將開始字符串(^
)。如果你想允許放置位在前方以及(如4cos(2)
),你可以例如使用:(?![AZ])
/\b(\d*)(cos|sin|tan|ln)(\s|\(|\\left)/
太棒了!謝謝 – me987654323 2015-04-02 16:07:37
這就是說,如果你打算寫一個數學解析器,你應該使用上下文無關文法(a * compiler-compiler *)。這將使解析方式更容易,更不容易出錯。 – 2015-04-02 16:15:27
你的正則表達式期待本場比賽的第一個字符是一個非a-z
因爲(?![a-z])
,並且是空白或數字,因爲(\s|\d|)
。
cos azertcos sin(tan xxx cos cos\left tan
或者你可以擺脫(?![a-z])(\s|\d|)
我認爲OP引入了它來獲得'foocos'和其他調用的紅色。 – 2015-04-02 16:04:20
我不會建議領先空間。它更像是一種黑客攻擊,並且使得'(!![a-z])'是多餘的。 – 2015-04-02 16:04:26
@ʰᵈˑ同意,但我不確定OP真正想做什麼,所以我只是拋出選項 – 2015-04-02 16:06:02
的''在開始時防止第一「COS 「從被匹配。 – Default 2015-04-02 16:00:20
'(?![a-z])是不是表示第一個字符不能是'a-z'? – 2015-04-02 16:00:57