Perl:如何只替换匹配的字符串部分?

Ran*_*Rag 7 regex string perl

我有一个字符串foo_bar_not_needed_string_part_123.现在在这个字符串中,我想not_needed_string_part只在foo_后面跟着时删除bar.

我用下面的正则表达式:

my $str = "foo_bar_not_needed_string_part_123";

say $str if $str =~ s/foo_(?=bar)bar_(.*?)_\d+//;
Run Code Online (Sandbox Code Playgroud)

但它删除了整个字符串,只打印一个换行符.

所以,我需要的是只删除匹配的(.*?)部分.那么,输出是

foo_bar__123.
Run Code Online (Sandbox Code Playgroud)

rai*_*7ow 6

还有另一种方式,它很简单:

my $str = "foo_bar_not_needed_string_part_123";
$str =~ s/(?<=foo_bar_)\D+//gi;
print $str;
Run Code Online (Sandbox Code Playgroud)

诀窍是使用lookbehind check anchor,并替换该锚点后面的所有非数字符号(不是符号).基本上,使用此模式,您只匹配需要删除的符号,因此无需捕获组.

作为旁注,原始的正则表达式(?=bar)bar构造是多余的.第一部分(lookahead)只有在某个位置跟随'bar'时才匹配 - 但这正是用模式的非超前部分检查的内容.


tan*_*guy 5

您可以捕获不想移除的部分:

my $str = "foo_bar_not_needed_string_part_123";
$str =~ s/(foo_bar_).*?(_\d+)/$1$2/;
print $str;
Run Code Online (Sandbox Code Playgroud)