在Perl中用每个字符一个空格替换模式

cal*_*llo 4 regex perl

假设我正在尝试将URL与正则表达式匹配:

$text = 'http://www.google.com/';
$text =~ /\bhttp:\/\/([^\/]+)/;
print $1;  # It prints www.google.com
Run Code Online (Sandbox Code Playgroud)

我想将其匹配的模式替换为其中每个字符的一个空格.例如,考虑到上面的例子,我想最后得到这个文本:

# http://              /
Run Code Online (Sandbox Code Playgroud)

有一个简单的方法吗?找出匹配模式有多少个字符,并用相同数量的不同字符替换它?

谢谢.

Ilm*_*nen 6

一个简单的方法是:

$text =~ s!\b(http://)([^/]+)!$1 . " " x length($2)!e;
Run Code Online (Sandbox Code Playgroud)

正则表达式\b(http://)([^/]+)一个单词边界,文字字符串匹配http://,和一个或多个非斜杠字符,捕捉http://$1和非斜杠字符$2.(请注意,我使用!上面的正则表达式分隔符而不是通常/的避免倾斜牙签综合症.)

运算符e末尾的开关s///导致替换$1 . " " x length($2)被计算为Perl代码而不是被解释为字符串.因此,它评估$1后面跟着字母一样多的空格$2.

  • 在v10之后,您可以使用`\ K`正则表达式运算符来避免不必要的捕获:`s!\ bhttp://\K([^ /] +)!""x length($ 1)!e`.这有点缩短正则表达式. (2认同)