如何正确分组用户定义的变量以进行语法突出显示?

时间:2014-06-09 04:14:53

标签: javascript regex ace-editor

我试图捕获用户定义的变量以突出显示目的。我已经冥想了一段时间,最后有一些似乎有用的东西(至少在各种正则表达式调试网站上。)但是,当我把它扔进Ace编辑器时,我得到:

Uncaught SyntaxError: Invalid regular expression: /#<error>/: Unterminated group

这是我的正则表达式,以及我试图解析的示例。

^(?:(?:(?:(?:volatile|non_volatile|persistent)\s*(?:integer|char|long|slong)\s*([a-zA-Z0-9]*)(?:$|.*|\[)|\s*(?:integer|char|long)\s*([a-zA-Z0-9]*)(?:$|.*|\[)|\s*(?!volatile|persistent|non_volatile|define_variable)([a-zA-Z0-9]*)(?:$|.*|\[)))|(?:volatile|non_volatile|persistent)\s([a-zA-Z0-9]*))

Regular expression visualization

Debuggex Demo

define_variable
volatile integer loop;
volatile char someChar
volatile long someLong
volatile anotherChar[3] = 'ABC';
anInteger = 33
VOLATILE INTEGER yetAnotherInt
Volatile[32] // this is not valid
someCharArray[32]
char anotherCharArray[32]
char singleChar
persistent slong slongValue[32];

测试我的正则表达式&amp; regex101.com上的代码示例产生了正确的匹配 - 想法,指针,建议?

1 个答案:

答案 0 :(得分:0)

ace的规则正则表达式要么没有捕获组,要么有一行跨越整个文本的组(如/(foo)(\s+)(bar)(\s+)(baz)/)。

这里的主要问题是你的正则表达式过于复杂,你不必将所有内容都放在一个规则中,但每次在根级别|创建一个新规则时,让ace合并它们

类似

   {
      regex: /(volatile|non_volatile|persistent)(\s+)(integer|char|long|slong)(\s+)([a-zA-Z0-9]+)/
      token: ["token1", "text", "token2", "text", "token3"]
   },
   {
      regex: /(\s*)(integer|char|long)(\s+)([a-zA-Z0-9]+)/
      token: ["text", "token1", "text", "token2"]
   },

更好的方法是使用createKeywordMapper查看https://github.com/ajaxorg/ace/blob/v1.1.3/lib/ace/mode/javascript_highlight_rules.js#L40

另请注意,\s*使用\s+代替(?:volatile|non_volatile|persistent)\s*(?:integer|char|long|slong)匹配可能错误的volatileinteger