admin管理员组文章数量:1435859
I'm trying to use CodeMirror simple mode to create my own editor and highlight some custom keywords. However, it's highlighting occurrences of these words inside other words. Here's my code to define the mode of the editor:
CodeMirror.defineSimpleMode("simple", {
// The start state contains the rules that are intially used
start: [
// The regex matches the token, the token property contains the type
{regex: /["'](?:[^\\]|\\.)*?(?:["']|$)/, token: "string"},
{regex: /;.*/, token: "ment"},
{regex: /\/\*/, token: "ment", next: "ment"},
{regex: /[-+\/*=<>!]+/, token: "operator"},
{regex: /[\{\[\(]/, indent: true},
{regex: /[\}\]\)]/, dedent: true},
//Trying to define keywords here
{regex: /\b(?:timer|counter|version)\b/gi, token: "keyword"} // gi for case insensitive
],
// The multi-line ment state.
ment: [
{regex: /.*?\*\//, token: "ment", next: "start"},
{regex: /.*/, token: "ment"}
],
meta: {
dontIndentStates: ["ment"],
lineComment: ";"
}
});
When I type in the editor, this is what gets highlighted. I would expect the first two occurrences to be styled, but not the second two.
It's obviously something incorrect with this regular expression:
/\b(?:timer|counter|version)\b/gi
But I've tried it several different ways and the same pattern works correctly in other regex testers. Example: . Any advice?
Edit #1:
Tried this pattern in codemirror definition, dropping the /g but it still yields the same incorrect highlighting.
{regex: /\b(?:timer|counter|version)\b/i, token: "keyword"}
I'm trying to use CodeMirror simple mode to create my own editor and highlight some custom keywords. However, it's highlighting occurrences of these words inside other words. Here's my code to define the mode of the editor:
CodeMirror.defineSimpleMode("simple", {
// The start state contains the rules that are intially used
start: [
// The regex matches the token, the token property contains the type
{regex: /["'](?:[^\\]|\\.)*?(?:["']|$)/, token: "string"},
{regex: /;.*/, token: "ment"},
{regex: /\/\*/, token: "ment", next: "ment"},
{regex: /[-+\/*=<>!]+/, token: "operator"},
{regex: /[\{\[\(]/, indent: true},
{regex: /[\}\]\)]/, dedent: true},
//Trying to define keywords here
{regex: /\b(?:timer|counter|version)\b/gi, token: "keyword"} // gi for case insensitive
],
// The multi-line ment state.
ment: [
{regex: /.*?\*\//, token: "ment", next: "start"},
{regex: /.*/, token: "ment"}
],
meta: {
dontIndentStates: ["ment"],
lineComment: ";"
}
});
When I type in the editor, this is what gets highlighted. I would expect the first two occurrences to be styled, but not the second two.
It's obviously something incorrect with this regular expression:
/\b(?:timer|counter|version)\b/gi
But I've tried it several different ways and the same pattern works correctly in other regex testers. Example: https://regex101./r/lQ0lL8/33 . Any advice?
Edit #1:
Tried this pattern in codemirror definition, dropping the /g but it still yields the same incorrect highlighting.
{regex: /\b(?:timer|counter|version)\b/i, token: "keyword"}
Share
Improve this question
edited Jun 20, 2020 at 9:12
CommunityBot
11 silver badge
asked Nov 22, 2016 at 15:29
colinwurtzcolinwurtz
7231 gold badge7 silver badges26 bronze badges
5
-
1
You should drop the
/g
modifier:/\b(?:timer|counter|version)\b/i
. I don't know if it's the cause of your problem, but it definitely isn't needed. Otherwise, the regex looks fine. – Alan Moore Commented Nov 22, 2016 at 16:26 -
@AlanMoore Thanks, I did try that but still got the same result. Removing the
/g
modifier limited my matches here though. – colinwurtz Commented Nov 22, 2016 at 16:55 -
What does it do with the word
timerNO
? That is, does the\b
at the end work? – Alan Moore Commented Nov 22, 2016 at 17:06 -
1
@AlanMoore this pattern
{regex: /\b(?:timer|counter|version)\b/i, token: "keyword"}
does not highlighttimerNO
. Does it seem like it's not respecting the/b
at the beginning? – colinwurtz Commented Nov 22, 2016 at 17:13 -
1
I suspect it's treating the beginning of the match as the beginning of the string. If that's the case, then a regex like
/\b!bar/
won't match anywhere, even infoo!bar
. – Alan Moore Commented Nov 22, 2016 at 17:30
1 Answer
Reset to default 6I ended up just defining my own mode from scratch and the additional customization seems to have worked. I parse the stream by word, convert to lowercase, then check if it's in my list of keywords. Using this approach it seems very straightforward to add additional styles and keywords.
var keywords = ["timer", "counter", "version"];
CodeMirror.defineMode("mymode", function() {
return {
token: function(stream, state) {
stream.eatWhile(/\w/);
if (arrayContains(stream.current(), keywords)) {
return "style1";
}
stream.next();
}
};
});
var editor = CodeMirror.fromTextArea(document.getElementById('cm'), {
mode: "mymode",
lineNumbers: true
});
function arrayContains(needle, arrhaystack) {
var lower = needle.toLowerCase();
return (arrhaystack.indexOf(lower) > -1);
}
Working Fiddle
本文标签: javascriptCodeMirror simple moderegex not highlighting as expectedStack Overflow
版权声明:本文标题:javascript - CodeMirror simple mode - regex not highlighting as expected - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1745673688a2669721.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论