2015-04-27 48 views
0

我在我的瀏覽器,並與一些在線的JavaScript測試人員測試該代碼片段:此JavaScript代碼片段似乎不會去掉JavaScript中的Unicode轉義字符 - 爲什麼?

var s = "testing \uone two three"; 
s = s.replace(/\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]/g,''); 
alert (s); 

我期望的結果警報是剛剛「試一二三」,而是出現一個有趣的人物,其中\ u0123是。

我的問題是爲什麼不更換條帶呢?

我知道這不是最優雅的正則表達式。但這不正確嗎?我正在剝掉反斜槓字符,然後是正好4個十六進制字符。無論如何還是在努力。

回答

4

我的問題是爲什麼不更換條帶呢?

因爲/\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]/g正則表達式字面上匹配\u字符串後跟4個十六進制字符。

而在字符串文字中指定\u0123在解析步驟中被視爲碼點,所以在運行時字符串中沒有\u0123,但是有2個物理字節的UTF-16。

你真正想要什麼,而不是是一樣的東西[\u0080-\uFFFF]:

> "testing \uone two three".replace(/[\u0080-\uFFFF]/g, '') 
"testing one two three" 

該字符集指定所有不屬於ASCII空格碼點。

在字符串文字,正則表達式文本和標識符中,任何字符(代碼單元)也可以表示爲由六個字符組成的Unicode轉義序列,即\ u加四個十六進制數字。

參考文獻:

+0

另一件事,你的正則表達式不能像你期望的那樣工作,因爲JS被卡在UCS-2處理字符串中。 (好吧,我不認爲在JS字符串中有任何實際上在UTF-16代碼點上運行的函數)。使用'\ uFFFF'的早期解決方案起作用,因爲它也覆蓋了代理代碼單元。 – nhahtdh

+0

@nhahtdh哦,我需要停止信任MDN了,它聲明「Unicode轉義序列需要至少四個字符在\ u之後。 – zerkms

+0

有趣。該字符串出現在我正在檢索的某個JSON中。至少在BBEdit中就是這樣。儘管我嘗試了你的表達方式,但它確實有效,所以我猜想使用你的表達更安全。謝謝。 –

0

你的代碼可與一些小的修改是:

var s = "testing \\uone two three"; // (1) 
s = s.replace(/\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]/g,''); // (2) 
alert (s); 
  1. 轉義字符串中的「\」。
  2. 轉義正則表達式中的「\」字符。
相關問題