Perl:在运行时构造简单的正则表达式

时间:2014-07-01 18:39:24

标签: regex perl runtime

我正在尝试在运行时构造一个小的正则表达式,但不知何故它从不匹配 - 我做错了什么?

my $word = quotemeta("test");
my $lines = "just a test to testing find tester testönig something fastest out pentest";

my $rule = "m/" . $word . "/g";
my $regex = qr/$rule/;

while ($lines =~ $regex) {
    # this never happens...
    print "\nFound pattern: '$&'";
}

2 个答案:

答案 0 :(得分:1)

这可能是你想要的:

#!/usr/bin/perl

use strict;
use warnings;

my $word = quotemeta("test");
my $lines = "just a test to testing find tester testönig something fastest out pentest";

my $regex = qr/$word/;

while ($lines =~ /$regex/g) {
    print "\nFound pattern: '$&'";
}

您不能将/g直接用于qr

答案 1 :(得分:1)

您的代码:

my $word = quotemeta("test");
my $rule = "m/" . $word . "/g";
my $regex = qr/$rule/;

与此相同:

my $word = quotemeta("test");
my $rule = "m/test/g";     # interpolated $word
my $regex = qr~m/test/g~;  # interpolated $rule

也就是说,它匹配文字字符串" m/test/g"没有别的。

buff已经提供了与我建议的代码相同的代码,但我建议避免使用$&,因为perlvar中提到的性能损失:

  

在程序中的任何位置使用此变量都会产生相当大的影响   所有正则表达式匹配的性能损失。为了避免这种情况   惩罚,您可以使用@-提取相同的子字符串。从...开始   在Perl v5.10.0中,您可以使用/p匹配标志和${^MATCH}变量   为特定的匹配操作做同样的事情。