CodeMirror 正则表达式与典型 Javascript 正则表达式解析器的行为不匹配
CodeMirror regex doesn't match behavior typical Javascript regex parser
我目前正在使用 Codemirror Simplemode 来定义模式。
我有一个要突出显示的关键字列表,我想我可以用我的关键字替换演示中的关键字。在替换关键字之前,我注意到正则表达式在给定关键字之前接受了字符。
具体来说,我有兴趣更改以下段落:
// 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”是试图强制正则表达式显式解析单词。在几个正则表达式测试器中测试,以下示例正常工作:
*RegexPal 产生类似的结果。
但是,此正则表达式在 Codemirror 中失败:
我的问题:当 codemirror 在其他 rejex 测试器中被拒绝时,为什么它仍然在第二行着色 A"function"?
虽然这并不能完全回答我关于如何让 SimpleMode 工作的问题,但它确实回答了关于实现我的总体目标的问题。
与其使用 SimpleMode 或编写您自己的模式,使用 codemirror-grammar 可能会容易得多,它会为您动态生成模式。
由于 JavaScript 的正则表达式 API 的限制,强制正则表达式匹配从字符串中的给定位置开始的唯一方法是在其前面加上前缀 ^
并将其与该位置之后的子字符串匹配。这意味着当 A
之后的标记与字符串 "function"
匹配时,您的正则表达式将被应用,并且 \b
将匹配,因为它落在字符串的开头。
(ES6 的一部分 'sticky' regexp 标志修复了这个问题,但尚未得到广泛支持,因此 CodeMirror 不依赖它。)
我目前正在使用 Codemirror Simplemode 来定义模式。
我有一个要突出显示的关键字列表,我想我可以用我的关键字替换演示中的关键字。在替换关键字之前,我注意到正则表达式在给定关键字之前接受了字符。
具体来说,我有兴趣更改以下段落:
// 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”是试图强制正则表达式显式解析单词。在几个正则表达式测试器中测试,以下示例正常工作:
但是,此正则表达式在 Codemirror 中失败:
我的问题:当 codemirror 在其他 rejex 测试器中被拒绝时,为什么它仍然在第二行着色 A"function"?
虽然这并不能完全回答我关于如何让 SimpleMode 工作的问题,但它确实回答了关于实现我的总体目标的问题。
与其使用 SimpleMode 或编写您自己的模式,使用 codemirror-grammar 可能会容易得多,它会为您动态生成模式。
由于 JavaScript 的正则表达式 API 的限制,强制正则表达式匹配从字符串中的给定位置开始的唯一方法是在其前面加上前缀 ^
并将其与该位置之后的子字符串匹配。这意味着当 A
之后的标记与字符串 "function"
匹配时,您的正则表达式将被应用,并且 \b
将匹配,因为它落在字符串的开头。
(ES6 的一部分 'sticky' regexp 标志修复了这个问题,但尚未得到广泛支持,因此 CodeMirror 不依赖它。)