我试图捕获用户定义的变量以突出显示目的。我已经冥想了一段时间,最后有一些似乎有用的东西(至少在各种正则表达式调试网站上。)但是,当我把它扔进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]*))
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上的代码示例产生了正确的匹配 - 想法,指针,建议?
答案 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
。