我写正则表达式来删除字符串中的多个空格。代码很简单:
my $string = 'A string has more than 1 space';
$string = s/\s+/\s/g;
但是,结果是坏事:'Asstringshassmoresthans1sspace'。它用's'字符替换每个空格。
有一种解决方法,而不是使用\ s进行替换,我使用''。所以正则表达式变成了:
$string = s/\s+/ /g;
为什么带正号的正则表达式不起作用?
答案 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
等特殊字符。替换字符串没有。
如果人们停止误解替换运算符是如何组成的,他们可能会停止期望正则表达式功能在正则表达式之外工作: - )