Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Perl中,将模式替换为每个字符一个空格_Regex_Perl - Fatal编程技术网

Regex 在Perl中,将模式替换为每个字符一个空格

Regex 在Perl中,将模式替换为每个字符一个空格,regex,perl,Regex,Perl,假设我正在尝试将URL与正则表达式匹配: $text = 'http://www.google.com/'; $text =~ /\bhttp:\/\/([^\/]+)/; print $1; # It prints www.google.com 我想将它匹配的模式替换为每个字符一个空格。例如,考虑到上述示例,我想以以下文字结束: # http:// / 有没有一个简单的方法可以做到这一点?找出匹配的模式有多少个字符,并用相同数量的不同字符替换它 谢谢。一个简单的

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

$text = 'http://www.google.com/';
$text =~ /\bhttp:\/\/([^\/]+)/;
print $1;  # It prints www.google.com
我想将它匹配的模式替换为每个字符一个空格。例如,考虑到上述示例,我想以以下文字结束:

# http://              /
有没有一个简单的方法可以做到这一点?找出匹配的模式有多少个字符,并用相同数量的不同字符替换它

谢谢。

一个简单的方法是:

$text =~ s!\b(http://)([^/]+)!$1 . " " x length($2)!e;
regexp
\b(http://)([^/]+)
匹配单词边界、文本字符串
http://
、一个或多个非斜杠字符,捕获
$1
中的
http://
$2
中的非斜杠字符。(注意,我使用了
作为上面的regexp分隔符,而不是通常的
/
来避免。)


s//
运算符末尾的
e
开关导致替换
$1。“x长度($2)
将作为Perl代码计算,而不是解释为字符串。因此,它的计算结果为
$1
,后跟与
$2

中字母数量相同的空格。在v10之后,您可以使用
\K
正则表达式操作符来避免不必要的捕获:
s\必和必拓://\K([^/]+)!“x长度($1)!e
。这将正则表达式缩短了一点。这非常令人印象深刻!我甚至不知道“x”操作符的存在。非常感谢。这可能不是正则表达式的工作,而是您选择的语言中的现有工具的工作。正则表达式并不是一根魔杖,你在遇到每一个涉及字符串的问题时都会挥舞它。您可能希望使用已经编写、测试和调试的现有代码。在PHP中,使用函数。Perl:。鲁比:。NET:URL只是一个例子。我真正需要知道的是如何将一个模式替换为模式本身的尽可能多的字符。例如,这也可以用来屏蔽信用卡号码或类似的东西(xxxxxxxxxxxx1234)。谢谢你的意见。