仅将命名组用于反向引用

Using a named group only for a back reference

在这个正则表达式中:

/\b([aeiouy])\w{2}\w+\b/g

捕获组仅供后向引用使用</code>。</p> <p>是否可以声明一个只存在于后向引用的命名组?</p> <p>我唯一能做的就是从匹配中排除 <code>([aeiouy])(?:),但在那种情况下我不能再使用我的反向引用了。

例如在 Perl 中:

#!/usr/bin/perl
use 5.010;
$_ = 'accordion accalmie diacritic ettercap';
say join ' ', /\b(([aeiouy])\w{2})(\w+)\b/g;

我要显示的位置:

acc lmie ett rcap

不是这个:

acc a lmie ett e rcap

另一个解决方案将涉及命名组:

#!/usr/bin/perl
use Data::Dumper;
$_ = 'accordion accalmie diacritic ettercap';
print Dumper \%+ while /\b(?<pre>([aeiouy])\w{2})(?<post>\w+)\b/g;

$VAR1 = {
          'post' => 'lmie',
          'pre' => 'acc'
        };
$VAR1 = {
          'post' => 'rcap',
          'pre' => 'ett'
        };

编辑

另一个可能比上面的例子更好的例子是这种情况:

m/(?<=<(name)>)\w+(?=<\/>)/g

我要匹配的地方 foobar

<item>
   <name>foo</name>
   <id>23</id>
</item>
<item>
   <name>bar</name>
   <id>42</id>
</item>

(name) 允许不重复自己,这里我使用环视来正确匹配 foobar。但是,此解决方案不如

m/(?<=<name>)\w+(?=<\/name>)/g

不会 return 任何不相关的捕获组。在我最初的问题中,我试图找到一种方法来引用捕获组,而无需在正则表达式之外使用它。

严格来说,这不是您问题的答案,但我还不能在此处对 Stack Overflow 发表评论。

为什么不直接取 </code> 和 <code>,避免你不想要的东西 (</code>)?</p> <pre><code>#!/usr/bin/perl use 5.010; $_ = 'accordion accalmie diacritic ettercap'; my @parts; push @parts, , while /\b(([aeiouy])\w{2})(\w+)\b/g; say join ' ', @parts; # prints "acc lmie ett rcap\n"

这不是问题的直接答案,但我认为这种匹配可以通过正则表达式实现,例如:

(?=\b([aeiouy])\w{2}\w+\b)\w{3}|(?<=(?!\A)\G[aeiouy])\w+\b

应该匹配 acclmie,作为单独的匹配项。