匹配第一场比赛的更改版本只有一个表达式?

时间:2010-04-20 13:49:34

标签: javascript regex backreference regex-alternation

我正在为Alex Gorbatchev的Syntax Highlighter写一个画笔,以突出显示Smalltalk代码。现在,请考虑以下Smalltalk代码:

aCollection do: [ :each | each shout ]

我想找到块参数“:each”,然后在每次出现之后匹配“each”(为简单起见,假设每次出现都不在括号内)。 请注意,参数可以具有任何名称,例如“:myArg”

我尝试匹配“:each”:

\:([\d\w]+)

这似乎有效。问题是我匹配“每个”的出现。我认为这样的事情可行:

\:([\d\w]+)|\1

但是,交替的右侧似乎被视为一个独立的表达,因此反向引用不起作用。

甚至可以在单个表达式中完成我想要的内容吗?或者我是否必须在第二个表达式中使用反向引用(通过另一个函数调用)?

2 个答案:

答案 0 :(得分:0)

可以用支持可变长度lookbehind的语言(AFAIK只有.NET框架语言,Perl 6可能)来做。如果匹配(?<=:(\w+)\b.*)\1,您可以突出显示一个单词。但JavaScript根本不支持lookbehind。

但是无论如何这个正则表达式效率非常低(我刚刚在RegexBuddy中检查了一个简单的例子,正则表达式引擎需要超过60个步骤来处理文档中的几乎每个字符以决定匹配和不匹配),所以这不是如果你想用它来代码突出显示,这是一个好主意。

我建议你使用你提到的两步法:首先匹配:(\w+)\b(为安全而插入字边界,\d隐含\w),然后做一个文字搜索匹配结果\1

答案 1 :(得分:0)

我相信匹配之间Regex引擎存储的唯一东西就是最后一场比赛的位置。因此,在查找下一场比赛时,您不能在之前使用对该比赛的反向引用。

所以,不,我不认为这是可能的。