[英]RegExp `Range out of order in character class`
我有這個正則表達式:
[\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
。
我真的很確定這是一個 String escaping 錯誤,但我找不到問題所在。
我已經在 Dart ( r"..."
)、escaping 中的\
\u{1f300}
--> \\u{1f300}
中嘗試了一個原始字符串。
正如評論中所指出的,匹配 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
來實現。
可以在此處找到示例實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.