以下Perl
做了什么?
$string =~ s#[^a-zA-Z0-9]+# #sg;
$string =~ s#\s+# #sg;
我不认为[^a-zA-Z0-9]+
是句子的开头,a-zA-Z0-9
和\s+
中至少有一个是至少一个空格。
但我无法弄清楚这个片段作为一个整体做了什么。
答案 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;
分隔符的选择并不重要,但约定使用/
,除非该模式包含许多/
。
这里我们有两个替换运算符的实例。在前两个分隔符之间是要搜索的正则表达式模式。在最后两个分隔符之间是用于替换匹配文本的字符串。尾随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;