Perl中的正则表达式链接/混合

dgsult0t  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(103)

请考虑以下事项:

my $p1             = "(a|e|o)";
my $p2             = "(x|y|z)";
$text =~  s/($p1)( )[$p2]([0-9])/some action to be done/g;

字符串形式的正则表达式模式是否等于上面的元素的串联?即,上面的可以写为

$text =~  s/((a|e|o))( )[(x|y|z)]([0-9])/ some action to be done/g;
ajsxfq5m

ajsxfq5m1#

是的,模式中的变量被插入到模式中,在双引号的上下文中,你所显示的表达式是等价的。参见perlretut教程中的讨论。(我建议使用qr操作符。也参见perlretut中的讨论。)
但这种模式显然不对

  • 为什么要用双括号((a|e|o))呢?要么在变量中使用alternate,然后在正则表达式中捕获它
my $p1 = 'a|e|o';  # then use in a regex as
/($p1)/            # gets interpolated into: /(a|e|o)/

或在变量中指示捕获,但在正则表达式中删除括号

my $p1 = '(a|e|o)';  # use as
/$p1/                # (same as above)

捕获括号以任一种方式执行其工作,在这两种情况下,匹配项(aeo)都将捕获到表达式中的适当变量$1中,因为这是第一次捕获

  • 模式[(x|y|z)]匹配字符(x|......(等等)--[...]是字符类,它匹配其中的任一字符(少数字符有特殊含义)。
my $p2 = '(x|y|z)';  # then use as
/$p2/

或者使用字符类

my $p2 = 'xyz';  # and use as
/([$p2])/        # --> /([xyz])/

总的来说你会得到

use warnings;
use strict;
use feature 'say';

my $text = shift // q(e z7);

my $p1 = 'a|e|o';
my $p2 = 'xyz';

$text =~ s/($p1)(\s)([$p2])([0-9])/replacement/g;

say $_ // 'undef'  for $1, $2, $3, $4;

我添加了\s,而不是一个单空格,并且我用()捕获了字符类匹配(问题中的模式没有),因为这似乎是需要的。

7gcisfzg

7gcisfzg2#

这两个代码段都不是有效的Perl代码,因此它们是等效的,但只是在这两个代码段都不能编译的意义上。
但是假设你有一个有效的m//、s///或qr//操作符,那么是的,模式中的变量将按照你所描述的那样被处理。
例如,

my $p1 = "(a|e|o)";
my $p2 = "(x|y|z)";
$text =~ /($pl)( )[$p2]([0-9])/g;

相当于

$text =~ /((a|e|o))( )[(x|y|z)]([0-9])/g;

正如在回答您之前的问题时所提到的,(x|y|z)肯定是一个bug,应该是xyz

相关问题