以下是做什么的Perl
?
$string =~ s#[^a-zA-Z0-9]+# #sg;
$string =~ s#\s+# #sg;
我不明白那[^a-zA-Z0-9]+
是句子的开头,并且至少是其中一个a-zA-Z0-9
并且\s+
是至少一个空格。
但我无法弄清楚这个片段作为一个整体做了什么。
首先,它用一个空格替换字符串中的任何非字母数字字符序列(既不是大写字符、小写字符也不是数字)。
之后,它会替换所有多空格,即任何只有一个空格字符的空格序列。
第一个模式用空格替换所有不是字母数字的。
第二个用一个空格替换任意数量的白色字符(空格、制表符、换行符)
请注意,您可以将这两种模式替换为唯一模式:
$string =~ s#[^a-zA-Z0-9]+# #sg;
$string =~ s#[^a-zA-Z0-9]+# #sg;
$string =~ s#\s+# #sg;
更常写为
$string =~ s/[^a-zA-Z0-9]+/ /sg;
$string =~ s/\s+/ /sg;
分隔符的选择并不重要,但/
除非模式包含许多 some ,否则按惯例使用/
。
这里我们有两个替换运算符的实例。前两个分隔符之间是要搜索的正则表达式模式。最后两个分隔符之间是替换匹配文本的字符串。尾随s
和g
是标志。
该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;