同时使用多个正则表达式进行测试(用于语法分析)

3

我正在用JavaScript编写一个简单的语法高亮器,需要找到一种同时测试多个正则表达式的方法。

我的想法是找出哪个先匹配成功,以确定要查找的新表达式集。

这些表达式可能是这样的:

/<%@/, /<%--/, /<!--//<[a-z:-]/

起初,我尝试了一种策略,将表达式分组组合,如下:

/(<%@)|(<%--)|(<!--)|(<[a-z:-])/

这样我就可以知道哪个匹配组不是未定义的。但问题是,当某些子表达式包含组或反向引用时会出现问题。

因此,我的问题是:

有人知道在字符串中使用多个正则表达式查找匹配的好方法吗?

2个回答

5

你为什么不能将输入进行分词,然后测试每个标记的开头以查看其类型,以便进行高亮显示?我认为你在过度思考这个问题。使用简单的 if-elseif 级联就可以很好地解决这个问题:

if (token.startsWith("<%@")) {
  // paint it red
}
else if (token.startsWith("<%--")) {
  // paint it green
}
else if (token.startsWith("<!--")) {
  // paint it blue
}
else if (token.matches("^<[a-z:-]")) {
  // paint it black
}

上面的是伪代码,需要神奇地转换成JavaScript。我把这留给读者自己练习。

虽然这个例子有点简单,但语法高亮器要复杂一些,具有动态语法和范围,并且可以注入其他语法规则等等!但是,我可能有点想太多了。你的解决方案是朝着正确的方向迈出的一步。谢谢。 - Michael Andersen

2

ANTLR是一个出色的语法开发系统。有一个项目在http://code.google.com/p/antlr-javascript/上构建它的JavaScript后端。

我同意Welbog对你的正则表达式问题的回答,但是通过查看ANTLR生成的JavaScript语法,你可能可以学到很多关于实现JavaScript语法的知识。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接