2015-12-22 48 views
0

我目前使用Codemirror Simplemode來定義模式。CodeMirror正則表達式不匹配典型的Javascript正則表達式解析器

我有一個關鍵字的列表,我想突出顯示,並認爲我可以用我的演示替換關鍵字。在替換關鍵字之前,我注意到給出的關鍵字之前給定的正則表達式接受了字符。

具體地說,我感興趣的是改變了下面這段話:

// Rules are matched in the order in which they appear, so there is 
// no ambiguity between this one and the one above 
{regex: /(?:function|var|return|if|for|while|else|do|this)\b/, 
token: "keyword"}, 

到:

// Rules are matched in the order in which they appear, so there is 
// no ambiguity between this one and the one above 
{regex: /\b(?:function|var|return|if|for|while|else|do|this)\b/, 
token: "keyword"}, 

的「\ B」我在開始時加入是企圖迫使正則表達式明確解析一個詞。在幾個正則表達式測試器中的測試有以下示例正常工作:

enter image description here *正則表達式產生相似的結果。

然而,這個表達式中Codemirror失敗:

enter image description here

我的問題:爲什麼codemirror仍着色在第二行「功能」,當它在其他rejex測試者被拒絕?

回答

1

由於JavaScript的正則表達式API的限制,強制正則表達式匹配在字符串的給定位置開始的唯一方法是用^作爲前綴,並將其與該位置後的子字符串匹配。這意味着,在將A之後的標記與字符串"function"匹配時,將會應用您的正則表達式,並且\b將匹配,因爲它落在字符串的開頭。

(該'sticky'正則表達式標誌,ES6的一部分,修正這一問題,但尚未普遍不支持,所以CodeMirror不依賴於它。)

0

儘管這並不能完全回答我如何讓SimpleMode工作的問題,但它確實回答了完成我的總體目標的問題。

而不是使用SimpleMode或編寫自己的模式,它可能會更容易使用codemirror-grammar,它將動態地爲您生成模式。