这个片段在perl中做了什么?

时间:2013-06-24 21:07:06

标签: regex string perl

以下Perl做了什么?

$string =~ s#[^a-zA-Z0-9]+# #sg;  
$string =~ s#\s+# #sg;  

我不认为[^a-zA-Z0-9]+是句子的开头,a-zA-Z0-9\s+中至少有一个是至少一个空格。
但我无法弄清楚这个片段作为一个整体做了什么。

3 个答案:

答案 0 :(得分:4)

首先,它用一个空格替换字符串中的任何非字母数字字符序列(既不是大写字母,小写字母也不是数字)。

之后它会替换所有多个空格,即只有一个空格字符的任何空格序列。

答案 1 :(得分:3)

第一个模式用空格替换所有不是字母数字的模式。

第二个用一个空格替换任意数量的白色字符(空格,制表符,换行符)

请注意,您可以用唯一的模式替换这两种模式:

$string =~ s#[^a-zA-Z0-9]+# #sg;

答案 2 :(得分:1)

$string =~ s#[^a-zA-Z0-9]+# #sg;  
$string =~ s#\s+# #sg;  

通常写为

$string =~ s/[^a-zA-Z0-9]+/ /sg;  
$string =~ s/\s+/ /sg;  

分隔符的选择并不重要,但约定使用/,除非该模式包含许多/

这里我们有两个替换运算符的实例。在前两个分隔符之间是要搜索的正则表达式模式。在最后两个分隔符之间是用于替换匹配文本的字符串。尾随sg是标记。

s标志会影响.匹配的内容。鉴于未使用.s标志无用。

g标志导致所有匹配被替换而不是仅替换第一个匹配。


第一个正则表达式模式,[^a-zA-Z0-9]

[...]是一个匹配指定单个字符的字符类。前导^否定了该类,因此[^a-zA-Z0-9]匹配除了非重音拉丁字母和数字之外的任何字符。

atom+匹配atom一次或多次,因此[^a-zA-Z0-9]+匹配一系列非字母数字字符(以及一些字母数字字符,例如“é”)。

因此,s/[^a-zA-Z0-9]+/ /g用一个空格替换所有非字母数字字符序列(以及一些字母数字字符,如“é”)。例如,"abc - déf :)"变为"abc d f "


第二个正则表达式模式\s+

\s匹配任何空格字符(有时除了垂直制表符和非空格字符)。

因此,s/\s+/ /g用一个空格替换所有空白序列。例如,"abc\tdef ghi\n"变为"abc def ghi "


整体

当一起使用时,第二个语句绝对没有。在第一个语句之后$string中永远不会有任何两个或更多空格字符的序列。

所以

$string =~ s#[^a-zA-Z0-9]+# #sg;  
$string =~ s#\s+# #sg;

相同
$string =~ s/[^a-zA-Z0-9]+/ /g;