如何将一组替换插入到Perl正则表达式中?

Pau*_*han 2 regex perl

有可能做到:

@foo = getPileOfStrings();

if($text =~ /@foo(*.?)@foo/)
{
 print "Sweet, you grabbed a $1! It lived between the foos!";
}
Run Code Online (Sandbox Code Playgroud)

这里发生的事情是我需要一个$text =~ /($var1|$var2|$var3)(*.?)($var1.../; 我不知道有多少值,直到运行时我才知道这些值.

数组插值到一组OR似乎是直接的方法,但它似乎没有正常工作,我进入一个扭曲的代码集...它都是一样的!

Cha*_*ens 11

使用joinqr//操作员:

my $strings = join "|", getPileOfStrings();
my $re      = qr/$strings/; #compile the pattern

if ($text =~ /$re(*.?)$re/)
Run Code Online (Sandbox Code Playgroud)

如果你想用同一个词分隔中间的东西说:

if ($text =~/($re)(.*?)\1/)
Run Code Online (Sandbox Code Playgroud)

如果字符串可能包含Perl正则表达式认为特殊的字符,您可能希望使用mapquotemeta防止它们被正则表达式使用:

my $strings = join "|", map quotemeta, getPileOfStrings();
Run Code Online (Sandbox Code Playgroud)

并且,正如迈克尔·卡曼所指出的那样,如果getPileOfStrings()不是按照你希望它们匹配的顺序返回字符串,你可能想要使用sort强制最长的匹配在交替中的第一个(交替中的项目将在在Perl 5中首先匹配:

my $strings = join "|" map quotemeta,
    sort { length $a <=> length $b } getPileOfStrings();
Run Code Online (Sandbox Code Playgroud)

记得在运行quotemeta之前进行排序,因为"a..."(长度4)将被转换为"a\\.\\.\\."(长度6),其长度超过"aaaaaa"(长度5).

  • 交替中的事物顺序可能很重要.除非`getPileOfStrings()`可以信任,否则你应该先按长度对结果进行排序,然后再使用最长的值. (2认同)