2014-01-24 16 views
1

我正在Javascript中使用replace javascript函數進行一些測試。Javascript正則表達式「replace(/ [-_]/g)」刪除數字?

考慮在node REPL上執行的以下示例。
這是一個replace,它從字符串中刪除空格,連字符和下劃線。

> "call this 9344 5 66 22".replace(/[ _-]/g, ''); 
'callthis934456622' 

這就是我期待的。只刪除空格。

但是看看這個:

> "call this 9344 5 66 22".replace(/[ -_]/g, ''); 
'callthis' 

爲什麼當我把這個表達式組合確切這樣-_(空格,連字符,下劃線)它刪除字符串中的數字?


更多的測試,我做的事:

-(空格,連字符)不刪除號碼

_(空格,下劃線)不刪除號碼

_-(空格,下劃線連字符)不會刪除數字

-_(連字符,下劃線,空格)d oes不刪除數字

_-(下劃線,連字符,空格)REPL塊?

-_(空間,連字符,下劃線)執行刪除號碼

+0

使用'/ [\ -_]/g' – plalx

回答

14

[ -_]意味着字符從space(ASCII 32)_(ASCII 95),其包括,除其他外,數字和大寫字母。

你在找什麼是[ \-_]。轉義-將使其行爲像字符而不是範圍的元字符。

+0

另一個

:條款,其被加亮後,和文字破折號

實施例防止範圍的方法是將「 - 」作爲類中的第一個字符,如'[-_]'中的,但反斜槓轉義更可靠並且更易於識別。 – Palpatim

+0

確實!無論如何,我喜歡逃避它。它防止創建一個無意的範圍,如果一個字符被添加到字符類。 – Vache

+0

我可能會失明。無法理解我怎麼看不到它是一個範圍。謝謝 –

3

連字號如果不存在,在字符類的開始或結束位置需要否則逃脫它表示range

所以此正則表達式:

[ -_] 

將從空間匹配任何強調即ASCII 32-95

3

-字符在字符類中有特殊含義。當它出現在兩個字符之間時,它代表字符範圍 —例如[a-z]可以匹配任何字符,其中包含az之間的字符代碼。

但是,正如你所看到的,當它被放置在字符類的開始或結尾時,它只是表示一個文字-字符。這也可以通過在字符類別—(即[ \-_])內跳過-來完成。

2
"call this 9344 5 66 22".replace(/(\s|-|_)/g, ''); 
1

在一個類中,破折號 - 字符有特殊含義的範圍內操作,只有當
獨立的條款,從左到右進行分析。

否則它被認爲沒有任何其他文字不同。

正則表達式解析器沒有時間去操心好形式

所以你可以把短劃線放在你想要的任何地方作爲一個文字,只要它將條款分開(即它不含糊)。

大多數人把它放在末尾或開始或逃脫它,所以沒有發生概念錯誤。 [ - a-z - \p{L} - 0-9 - \x00-\x09 - \ x20-]