2013-06-24 53 views
2

以下內容在Perl中做了什麼?這段代碼在Perl中做了什麼?

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

我那已瞭解是[^a-zA-Z0-9]+句子的開始和a-zA-Z0-9至少一個\s+至少是一個空白。
但我無法弄清楚這個代碼片段作爲一個整體。

+6

你爲什麼不把它兜風?代碼很簡單。喂一些字符串,看看會發生什麼。 –

+2

'[^ a-zA-Z0-9]'不是句子的開頭。 '^ ...'和'[^ ...]'有不同的含義。 – mob

+0

另外,我認爲第一個正則表達式已經包含第二個正則表達式,用於非Unicode'$ string' – doubleDown

回答

3

第一個圖案用空格替換所有不是字母數字的圖案。

第二通過一個單一的空間替換任何數目的白字符(空格,製表符,新行)

請注意,可以通過僅圖案替換這些兩種模式:

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

不,我認爲這是不正確的連接所有它在相同的模式,因爲'\ S'添加漫遊和其他符號在角色類中,這將被排除在外。 – Birei

+0

@Birei:你是對的,一個簡單的否定alnum包含白色字符。 –

+0

@CasimiretHippolyte:抱歉的拉門問題。 1)不是'#'在perl中的註釋嗎?這個代碼如何工作? 2)如何完成空間替換。即代碼的哪一部分用空格替代alnum – Jim

4

首先,它用單個空格替換字符串中非字母數字字符的任何序列(既不是大寫字母,也不是小寫字母,也不是數字)。

之後,它將替換所有多空格,即只有一個空格字符的任何空白序列。

+0

不在一行。 '/ s'標誌一次替換每一行。而且,角色類('[[...]')與換行符匹配,所以它們也會被刪除。 – Birei

+0

沒錯。這是我對錯誤解讀的遺漏的一個遺留問題 - 我首先從最初的「#」意思之後讀到它。然後我意識到它在組內。 我編輯了答案。 Thx –

+1

這裏有更多的語言比英語...;),所以'字母數字'是誤導一點 - 只爲'ascii',而不是'Ángrybird' :) – jm666

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+匹配​​一次或多次,所以[^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;