JavaScript、正則表達式和 Unicode
並非所有速記字符類和其他 JavaScript 正則表達式語法都支持 Unicode。在某些情況下,準確了解某些令牌匹配的內容可能很重要,這就是本文將要探討的內容。
根據 ECMA-262 第 3 版,\s
, \S
, .
, ^
, 和 $
使用基於 Unicode 的 空格 解釋 和 換行 , 而 \d
, \D
, \w
, \W
, \b
, 和 \B
使用 digit 的純 ASCII 解釋 , 單詞字符 , 和 單詞邊界 (例如 /a\b/.
返回 true
)。實際的瀏覽器實現通常在這些方面有所不同。例如,Firefox 2 考慮 \d
和 \D
是 Unicode 感知的,而 Firefox 3 修復了這個錯誤 - 使 \d
相當於 [0-9]
與大多數其他瀏覽器一樣。
以下是受影響的令牌及其定義:
\d
— 數字。\s
— 空白。\w
— 單詞字符。\D
— 數字除外。\S
— 除空白之外的所有內容。\W
— 除單詞字符外的所有字符。.
— 除換行符之外的所有內容。^
(使用/m
) — 字符串開頭和換行符之後的位置。$
(使用/m
) — 字符串末尾和換行符之前的位置。\b
— 單詞邊界位置。\B
— 不是單詞邊界位置。
以上所有內容都是 Perl 衍生正則表達式風格的標準。然而,術語digit的含義 , 空格 , 單詞字符 , 詞界 , 和 換行 取決於你使用的正則表達式風格、字符集和平台,所以這裡是官方的 JavaScript 含義,因為它們適用於正則表達式:
- 數字 — 僅限字符 0-9。
- 空格 — 製表符、換行符、垂直製表符、換頁符、回車符、空格、不間斷空格、行分隔符、段落分隔符和“任何其他 Unicode '空格分隔符'”。
- 單詞字符 — 僅限字符 A-Z、a-z、0-9 和 _。
- 字邊界 — 單詞字符之間的位置 和非單詞字符 .
- 換行 — 換行符、回車符、行分隔符和段落分隔符。
這裡又是換行符及其字符代碼:
\u000a
— 換行 —\n
\u000d
— 回車 —\r
\u2028
— 行分隔符\u2029
— 段落分隔符
請注意,ECMAScript 4 提案表明 C1/Unicode NEL“下一行”控製字符(\u0085
) 將被識別為該標準中的附加換行符。另請注意,儘管 CRLF(回車後跟換行符)在大多數情況下被視為單個換行符序列,但 /\r^$\n/m.test("\r\n")
返回 true
.
至於空格,ECMA-262 第 3 版使用基於 Unicode 的基本多語言平面的解釋,來自 Unicode 標準的 2.1 版或更高版本。以下是 \s
應該匹配的字符 根據 ECMA-262 第 3 版和 Unicode 5.1:
\u0009
— 選項卡 —\t
\u000a
— 換行 —\n
—(換行符)\u000b
— 垂直製表符 —\v
\u000c
— 換頁 —\f
\u000d
— 回車 —\r
—(換行符)\u0020
— 空間\u00a0
— 無間斷空間\u1680
— Ogham 空格標記\u180e
— 蒙古語元音分隔符\u2000
— 四邊形\u2001
— Em 四邊形\u2002
— 空間\u2003
— Em 空間\u2004
— 每人三個空間\u2005
— 每人四個空間\u2006
— 每人六個空間\u2007
— 圖空間\u2008
— 標點空格\u2009
— 狹小的空間\u200a
— 頭髮空間\u2028
— 行分隔符 —(換行符)\u2029
— 段落分隔符 —(換行符)\u202f
— 狹窄的不間斷空間\u205f
— 中等數學空間\u3000
— 表意空間
要測試瀏覽器中此處提到的所有標記匹配哪些字符或位置,請參閱 JavaScript 正則表達式和 Unicode 測試 .請注意,Firefox 2.0.0.11、IE 7 和 Safari 3.0.3 beta 的某些測試都出錯了。
更新: 我的新 Unicode 插件 對於 XRegExp 允許您輕鬆匹配 JavaScript 正則表達式中的 Unicode 類別、腳本和塊。