我有這個正則運算式:
[\u{1f300}-\u{1f5ff}\u{1f900}-\u{1f9ff}\u{1f600}-\u{1f64f}\u{1f680}-\u{1f6ff}\u{2600}-\u{26ff}\u{2700}-\u{27bf}\u{1f1e6}-\u{1f1ff}\u{1f191}-\u{1f251}\u{1f004}\u{1f0cf}\u{1f170}-\u{1f171}\u{1f17e}-\u{1f17f}\u{1f18e}\u{3030}\u{2b50}\u{2b55}\u{2934}-\u{2935}\u{2b05}-\u{2b07}\u{2b1b}-\u{2b1c}\u{3297}\u{3299}\u{303d}\u{00a9}\u{00ae}\u{2122}\u{23f3}\u{24c2}\u{23e9}-\u{23ef}\u{25b6}\u{23f8}-\u{23fa}\u{200d}]
當我在https://regex101.com上使用這個 RegExp 時,它作業正常。但是當我在 JavaScript 或 Dart 中使用這個 RegExp 時,我得到了Range out of order in character class錯誤。
我真的很確定這是一個字串轉義錯誤,但我找不到問題所在。
我已經在 Dart ( r"...") 中嘗試了一個原始字串,轉義了\in \u{1f300}--> \\u{1f300}。
uj5u.com熱心網友回復:
Unicode 匹配
正如評論中所指出的,匹配 unicode 字符需要正則運算式中的unicode 標志。
如果您嘗試使用 簡單地匹配 unicode 字符RegExp('\u123'),這將失敗,原因有兩個。
- 正則運算式中不能包含 unicode 字符。相反,您需要對它們進行轉義(例如,通過使用原始字串):
RegExp(r'\u123')。 - 這還是不行,因為現在正則運算式嘗試將字串(所以在每一個字符評估
\,u等等)。這是unicode 標志發揮作用的地方:RegExp('\u123', unicode: true).
請注意,對于 3 位元組 unicode 字符,您需要添加花括號,例如RegExp(r'u\{1f300}'. 有關更多資訊,請參閱此問題。
這意味著您的最終正則運算式應如下所示:
RegExp(
r'[\u{1f300}-\u{1f5ff}\u{1f900}-\u{1f9ff}\u{1f600}-\u{1f64f}'
r'\u{1f680}-\u{1f6ff}\u{2600}-\u{26ff}\u{2700}'
r'-\u{27bf}\u{1f1e6}-\u{1f1ff}\u{1f191}-\u{1f251}'
r'\u{1f004}\u{1f0cf}\u{1f170}-\u{1f171}\u{1f17e}'
r'-\u{1f17f}\u{1f18e}\u{3030}\u{2b50}\u{2b55}'
r'\u{2934}-\u{2935}\u{2b05}-\u{2b07}\u{2b1b}'
r'-\u{2b1c}\u{3297}\u{3299}\u{303d}\u{00a9}'
r'\u{00ae}\u{2122}\u{23f3}\u{24c2}\u{23e9}'
r'-\u{23ef}\u{25b6}\u{23f8}-\u{23fa}\u{200d}] ',
unicode: true,
);
字素簇
您可能會遇到的另一個問題是,您將無法將跨越多個字符的表情符號與初始正則運算式相匹配。請注意,在上面的代碼段中,我 在末尾添加了一個以匹配跨越多個字符的表情符號。
為了現在匹配單個表情符號,您需要在字串中的每個單個字符上運行正則運算式,由grapheme clusters定義。這可以使用package:characters.
可以在此處找到示例實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/363319.html
標籤:javascript 正则表达式 细绳 镖
