2

以下是做什么的Perl

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

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

4

3 回答 3

4

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

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

于 2013-06-24T21:09:24.857 回答
3

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

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

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

$string =~ s#[^a-zA-Z0-9]+# #sg;
于 2013-06-24T21:08:58.477 回答
1
$string =~ s#[^a-zA-Z0-9]+# #sg;  
$string =~ s#\s+# #sg;  

更常写为

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

分隔符的选择并不重要,但/除非模式包含许多 some ,否则按惯例使用/

这里我们有两个替换运算符的实例。前两个分隔符之间是要搜索的正则表达式模式。最后两个分隔符之间是替换匹配文本的字符串。尾随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;  
于 2013-06-24T22:29:35.903 回答