以下內容在Perl
中做了什麼?這段代碼在Perl中做了什麼?
$string =~ s#[^a-zA-Z0-9]+# #sg;
$string =~ s#\s+# #sg;
我那已瞭解是[^a-zA-Z0-9]+
句子的開始和a-zA-Z0-9
至少一個\s+
至少是一個空白。
但我無法弄清楚這個代碼片段作爲一個整體。
以下內容在Perl
中做了什麼?這段代碼在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;
分隔符的選擇並不顯著,但/
使用按照慣例,除非該模式包含了許多一些/
。
這裏我們有兩個替代運算符的例子。在前兩個分隔符之間是要搜索的正則表達式模式。最後兩個分隔符之間是替換匹配文本的字符串。尾部s
和g
是標誌。
s
標誌影響.
匹配的內容。鑑於.
沒有使用,s
標誌是沒用的。
g
標誌導致所有匹配被替換而不是第一個。
第一正則表達式模式,[^a-zA-Z0-9]
[...]
是一個字符類,它相匹配的指定中的單個字符。一個領先的^
否定類,所以[^a-zA-Z0-9]
匹配除了無拉丁字母和數字以外的任何字符。
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;
你爲什麼不把它兜風?代碼很簡單。喂一些字符串,看看會發生什麼。 –
'[^ a-zA-Z0-9]'不是句子的開頭。 '^ ...'和'[^ ...]'有不同的含義。 – mob
另外,我認爲第一個正則表達式已經包含第二個正則表達式,用於非Unicode'$ string' – doubleDown