Perl:当subexpr捕获时通过插值组合正则表达式

时间:2012-08-09 17:03:52

标签: regex perl assertions

我是Perl的新手,但我想知道如果我创建带有捕获的正则表达式变量,甚至是其他类型的副作用(如代码断言),然后使用插值将此正则表达式插入更大的正则表达式组合中会发生什么,然后再重复一次这个过程?

在副作用行为方面,控制最终成分的确是一团糟甚至可能吗?有关于此的文件吗?

2 个答案:

答案 0 :(得分:0)

这里有很多documentation,它附带Perl。 :)

首先,插值在Perl处理模式的字符之前发生。 Understand the order of operations in double quoted contexts。插值字符串中的任何特殊字符仍然是特殊字符。

要回答你的问题,你只需要尝试一下。

use v5.10;

my $start = qr/(Buster|Mimi)/;  
say "Starting regex --> $start";

my $middle = qr/My (cat is $start)/i;   
say "Middle regex --> $middle";

my $end = qr/Find \s+ "$middle"/x;  
say "End regex --> $end";

这表明每个正则表达式都嵌入在较大的正则表达式中,保留了它的选项。

Starting regex --> (?^:(Buster|Mimi))
Middle regex --> (?^i:My (cat is (?^:(Buster|Mimi))))
End regex --> (?^x:Find \s+ "(?^i:My (cat is (?^:(Buster|Mimi))))")

每个级别的捕获规则都是相同的。它们由开始捕获括号的顺序确定。 Perl不会让你跟踪任何类型的嵌套或“谁先到达那里”。如果您不想跟踪编号的捕获变量,可以使用命名捕获。

答案 1 :(得分:-1)

你的意思是这样吗?

my $name = "bob";
while ($name_from_file = <STDIN>) {
   chomp $name_from_file;
   if ($name_from_file =~ /^$name\n/i)
   print "I got something for $name!\n";
}
是的,你可以。

但是,更好的方法是使用qr来帮助构建正则表达式:

my $re_name = qr(^) . qr(bob) . qr(\s);
while ($name_from_file = <STDIN>) {
   chomp $name_from_file;
   if ($name_from_file =~ /$re_name/i)
   print "I got something for $name!\n";
}

这样,您的正则表达式可以更轻松地插入变量。