Perl在多行上拆分长替换正则表达式

时间:2019-12-23 22:11:55

标签: regex perl line-breaks substitution

我在Perl正则表达式中有一个很长的替换字符串,我想将其分成多行。将长替换字符串拆分成多行的语法是什么?我尝试了以下操作,但没有成功(不忽略空格):

$var =~ s/(some)(thing)/A_very_long_string_with_many_characters_that_should_be_split_over_
          multiple_lines_but_can't_be_for_whatever_reason._The_matching_groups_are_"$1"_and_"$2"/x;

我的正则表达式替换字符串比这个人为的例子交错得多,所以我不能仅仅将大的文字部分放入变量中。换句话说,以下内容对我来说没有帮助

my $prefix = 'A_very_long_string_with_many_characters_that_should_be_split_over_' .
             'multiple_lines_but_can\'t_be_for_whatever_reason._The_matching_groups_are_';
$var =~ s/(some)(thing)/$prefix"$1"_and_"$2"/;

有人知道一种将替换字符串分割成多行的方法吗?

2 个答案:

答案 0 :(得分:6)

替换面是一个字符串,需要经过一些特定的修饰符。 /e是一个独特的情况,当替换端被评估为代码时。但是,如果它是纯字符串,则它的求值方式不受(any?)修饰符的影响,并且肯定不受/x的影响,因为空格在字符串中计数。

如果使用/e,则可以根据需要在替换端编写代码,然后可以逐段形成替换字符串。

一种方法是使用sub来整齐地组织/e下的替换字符串的构建

$var =~ s/(some)(thing)/build_repl($1, $2)/e;

sub build_repl {
    my ($c1, $c2) = @_;
    return 
        qq(A_very_long...) .
        qq(The_matching...$c1...$c2);
}

答案 1 :(得分:3)

def book_not_found end 运算符的替换组件不是正则表达式,并且不受s///修饰符的影响。它是一个字符串,类似于用双引号引起来的字符串或反引号的内容。唯一的选择是将其构造为您所暗示的变量,或应用/x修饰符,从而将替换项转换为perl表达式,您可以在其中构造字符串,但是您需要用引号将其引号严格禁止使用裸字字符串。

/e