仅将命名组用于反向引用
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
我要匹配的地方 foo
和 bar
<item>
<name>foo</name>
<id>23</id>
</item>
<item>
<name>bar</name>
<id>42</id>
</item>
组 (name)
允许不重复自己,这里我使用环视来正确匹配 foo
和 bar
。但是,此解决方案不如
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
应该匹配 acc
和 lmie
,作为单独的匹配项。
在这个正则表达式中:
/\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
我要匹配的地方 foo
和 bar
<item>
<name>foo</name>
<id>23</id>
</item>
<item>
<name>bar</name>
<id>42</id>
</item>
组 (name)
允许不重复自己,这里我使用环视来正确匹配 foo
和 bar
。但是,此解决方案不如
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
应该匹配 acc
和 lmie
,作为单独的匹配项。