用\ s替换不能按预期工作

时间:2013-07-17 16:32:00

标签: regex perl

我写正则表达式来删除字符串中的多个空格。代码很简单:

my $string = 'A string has more than 1      space';
$string = s/\s+/\s/g;

但是,结果是坏事:'Asstringshassmoresthans1sspace'。它用's'字符替换每个空格。

有一种解决方法,而不是使用\ s进行替换,我使用''。所以正则表达式变成了:

$string = s/\s+/ /g;

为什么带正号的正则表达式不起作用?

4 个答案:

答案 0 :(得分:7)

\s只是正则表达式中的元字符(并且它不仅仅匹配空格,例如制表符,换行符和换页符),而不是替换字符串。如果要用一个空格替换所有空格,请使用一个简单的空格(如您所做):

$string = s/\s+/ /g;

如果您只想影响实际的空格字符,请使用

$string = s/ {2,}/ /g;

(无需自己替换单个空格)。

答案 1 :(得分:4)

你的问题的答案是\s是一个字符类,而不是文字字符。就像\w代表字母数字字符一样,它不能用于打印字母数字字符(w除外,它将打印出来,但这不是重点)。

如果我想保留匹配的空白的类型,我会做的是:

s/\s\K\s*//g

\K(保持)转义序列将阻止删除初始空白字符,但将删除所有后续空格。如果你不关心保留空格的类型,Tim已经给出了解决方案,那就是:

s/\s+/ /g

答案 2 :(得分:1)

\s代表匹配任何空格。它等同于:

[\ \t\r\n\f]

当您使用$string = s/\s+/\s/g;替换时,您将用字母s替换一个或多个空白字符。这是一个参考链接:http://perldoc.perl.org/perlrequick.html

答案 3 :(得分:1)

  

为什么正则表达式没有正常工作?

\s的正则表达式确实有效。什么不起作用是你的替换字符串。当然,正如其他人所指出的那样,它不应该。

人们对替换算子(s/.../.../)感到困惑。我经常发现人们认为整个运营商都是"正则表达式"。但事实并非如此,它是一个带有两个参数(或操作数)的运算符。

第一个操作数(在第一个和第二个分隔符之间)被解释为正则表达式。第二个操作数(在第二个和第三个分隔符之间)被解释为双引号字符串(当然,/e选项会稍微改变)。

所以替换操作如下所示:

s/REGEX/REPLACEMENT STRING/

正则表达式会识别^+以及\s等特殊字符。替换字符串没有。

如果人们停止误解替换运算符是如何组成的,他们可能会停止期望正则表达式功能在正则表达式之外工作: - )