【发布时间】:2016-05-24 01:40:31
【问题描述】:
根据我从有关 regex 的 Pharo 文档中收集到的信息,我可以定义一个正则表达式对象,例如:
re := '(foo|re)bar' asRegex
我可以通过这个用字符串替换匹配的正则表达式:
re copy: 'foobar blah rebar' replacingMatchesWith: 'meh'
这将导致:`'meh blah meh'。
到目前为止,一切都很好。但我想替换 'bar' 并保留前缀。因此,我需要一个变量来处理捕获的括号:
re copy: 'foobar blah rebar' replacingMatchesWith: '%1meh'
我想要结果:'foomeh blah remeh'。但是,这只是给了我:'%1meh blah %1meh'。我还尝试使用\1,或\\1,或$1,或{1},结果得到了文字字符串替换,例如,'\1meh blah \1meh'。
我可以在 GNU Smalltalk 中轻松做到这一点:
'foobar blah rebar' replacingAllRegex: '(foo|re)bar' with: '%1meh'
但我在 Pharo 正则表达式文档中找不到任何地方告诉我如何在 Pharo 中执行此操作。我也为 Pharo 正则表达式做了一堆谷歌搜索,但没有发现任何东西。此功能是 RxMatcher 类还是其他 Pharo 正则表达式类的一部分?
【问题讨论】:
-
pharo 似乎不支持用捕获组替换
-
那么,您尝试过通常的反向引用样式吗?喜欢
\1、\\1或$1(也许是matchesReplacedWith)?支持捕获组,从 Pharo 中可以做什么匹配很清楚,但没有提示是否支持将反向引用作为替换模式的一部分。 -
@WiktorStribiżew 是的,我也试过
\1、\\1和$1。在每种情况下,替换都是文字字符串。我更新了我的问题,表明这些尝试。我看到就匹配而言,支持捕获组。文档中有用于捕获和枚举捕获的示例。但是,没有关于在替换字符串中反向引用它们。这对我来说似乎是正则表达式查找/替换的基础,所以我很惊讶它不受支持。