正则表达式中的Perl正则表达式

时间:2016-10-25 19:50:56

标签: regex perl expression

我想问一下是否可以在替换匹配表达式的RHS中使用“e”修饰符放入另一个正则表达式。

例如,我想用相同数量的“ - ”替换$ foo中存储的任何单词,不区分大小写。

例如:

$str =~ s/($foo)/$temp = $1; $temp ~= s/./-//gie;

但是在编译时它会不断给出语法错误,而

$str =~ s/($foo)/$temp = $1; $temp = "---"/gie; 

确实有效。

我想我没有正确地逃避斜线,任何想法?

2 个答案:

答案 0 :(得分:6)

您当然需要e修饰符才能使用

$str = 'banana';
$foo = 'na';
$str =~ s/$foo/$&=~s#.#-#gr/ge;
print $str;

请参阅online Perl demo

请注意,外部正则表达式使用/正则表达式分隔符,而内部正则表达式包含不同的分隔符(您可以在此处使用您最喜欢的两个)。

e修饰符对外部模式是强制性的,您还需要将r修饰符传递给内部修饰符以避免修改只读值问题

另请注意,在Perl v.5.20之前,您最好避免使用$&,并将整个模式与(...)捕获组关联起来:

$str =~ s/($foo)/$1=~s#.#-#gr/ge;
          ^    ^ ^^ 

答案 1 :(得分:0)

此处不需要将s///嵌套到另一个s///

我知道这并没有回答这个问题,但回答了这个问题:

$_ = "footastic Funtastic Fantastic";
my $foo = "f..";
s/($foo)/'-' x length($1)/gie;
print;  # ---tastic ---tastic ---tastic