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

我正在为Alex Gorbatchev的Syntax Highlighter写一个画笔来强调Smalltalk代码。现在,考虑以下Smalltalk代码:
aCollection do: [ :each | each shout ]
我想找到块参数“:each”,然后在每次出现之后匹配“each”(为简单起见,让我们说每次出现不仅仅在括号内)。 请注意,参数可以具有任何名称,例如“:myArg”。 我尝试匹配“:each”:
:([dw]+)
这似乎有效。问题是我匹配“每个”的出现。我认为这样的事情可行:
:([dw]+)|1
但是,交替的右侧似乎被视为一个独立的表达,因此反向引用不起作用。 甚至可以在单个表达式中完成我想要的东西吗?或者我是否必须在第二个表达式中使用反向引用(通过另一个函数调用)?     
已邀请:
您可以使用支持可变长度lookbehind的语言(AFAIK只有.NET框架语言,Perl 6可能)。在那里你可以突出显示一个单词,如果它匹配
(?<=:(w+)b.*)1
。但JavaScript根本不支持lookbehind。 但无论如何这个正则表达式效率非常低(我刚刚在RegexBuddy中检查了一个简单的例子,正则表达式引擎需要超过60个步骤才能在文档中的几乎每个字符之间决定匹配和不匹配),所以这不是一个好主意如果你想用它来代码突出显示。 我建议你使用你提到的两步法:首先匹配
:(w+)b
(为了安全插入字边界,
d
隐含在
w
),然后搜索匹配结果
1
。     
我相信匹配之间Regex引擎存储的唯一东西就是最后一场比赛的位置。因此,在查找下一个匹配时,您不能使用之前的匹配反向引用。 所以,不,我不认为这是可能的。     

要回复问题请先登录注册