1

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

aCollection do: [ :each | each shout ]

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

我尝试匹配“:每个”:

\:([\d\w]+)

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

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

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

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

4

2 回答 2

0

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

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

我建议您使用您提到的两步方法:首先匹配:(\w+)\b(为安全起见插入单词边界,\d隐含在 中\w),然后对匹配结果进行文字搜索\1

于 2010-04-20T14:04:44.560 回答
0

我相信正则表达式引擎在匹配之间存储的唯一内容是最后一场匹配的位置。因此,在查找下一个匹配项时,不能使用对之前匹配项的反向引用。

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

于 2010-04-20T14:04:45.100 回答