Regex 仅将命名组用于反向引用

Regex 仅将命名组用于反向引用,regex,perl,pcre,Regex,Perl,Pcre,在此正则表达式中: /\b([aeiouy])\w{2}\1\w+\b/g 捕获组仅由反向引用\1使用 是否可以声明仅存在的命名组以供反向引用 我能做的唯一一件事就是从匹配中排除([aeiouy]),那就是(?:),但在这种情况下,我不能再使用反向引用了 例如,在Perl中: #!/usr/bin/perl use 5.010; $_ = 'accordion accalmie diacritic ettercap'; say join ' ', /\b(([aeiouy])\w{2})\2(

在此正则表达式中:

/\b([aeiouy])\w{2}\1\w+\b/g
捕获组仅由反向引用
\1
使用

是否可以声明仅存在的命名组以供反向引用

我能做的唯一一件事就是从匹配中排除
([aeiouy])
,那就是
(?:)
,但在这种情况下,我不能再使用反向引用了

例如,在Perl中:

#!/usr/bin/perl
use 5.010;
$_ = 'accordion accalmie diacritic ettercap';
say join ' ', /\b(([aeiouy])\w{2})\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})\2(?<post>\w+)\b/g;

$VAR1 = {
          'post' => 'lmie',
          'pre' => 'acc'
        };
$VAR1 = {
          'post' => 'rcap',
          'pre' => 'ett'
        };
(名称)
不允许重复我自己,这里我使用lookaround来正确匹配
foo
bar
。然而,这种解决方案不如其他解决方案干净

#!/usr/bin/perl
use 5.010;
$_ = 'accordion accalmie diacritic ettercap';
my @parts;
push @parts, $1, $3 while /\b(([aeiouy])\w{2})\2(\w+)\b/g;
say join ' ', @parts;
# prints "acc lmie ett rcap\n"

m/(?严格地说,这不是对你问题的回答,但我还不能在这里对堆栈溢出进行评论

为什么不直接拿走
$1
$3
,避免你不想要的东西(
$2


这不是一个问题的直接答案,但我认为这种匹配可以通过regex实现,比如:


(?=\b([aeiouy])\w{2}\1\w+\b)\w{3}|(?为什么要实现这一点?我不认为有办法做到这一点。这意味着反向引用和匹配数组的捕获组编号将不同,这将非常令人困惑。我也不认为我知道的任何正则表达式引擎中都有办法。但是,请注意,您应该添加一个标记来命名您所使用的正则表达式引擎例如使用。@anubhava匹配字符串的几个部分以在外部使用它们有时非常有用。为了避免混淆,应该从输出中消除内部匹配,例如递归、反向引用。有一些方法可以从匹配数组中丢弃它们,例如
unset($matches[1])但是,我在寻找一种更通用的方法,在这里我不需要手动考虑每一个代码> $n< /Case>匹配。我想把我的正则表达式看作是一个黑盒子,它只返回我需要的没有垃圾信息的东西。
<item>
   <name>foo</name>
   <id>23</id>
</item>
<item>
   <name>bar</name>
   <id>42</id>
</item>
m/(?<=<name>)\w+(?=<\/name>)/g
#!/usr/bin/perl
use 5.010;
$_ = 'accordion accalmie diacritic ettercap';
my @parts;
push @parts, $1, $3 while /\b(([aeiouy])\w{2})\2(\w+)\b/g;
say join ' ', @parts;
# prints "acc lmie ett rcap\n"
(?=\b([aeiouy])\w{2}\1\w+\b)\w{3}|(?<=(?!\A)\G[aeiouy])\w+\b