簡體   English   中英

RegExp`字符類中的范圍亂序`

[英]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 字符需要正則表達式中的unicode 標志

如果您嘗試使用RegExp('\u123')簡單地匹配 unicode 字符,這將失敗,原因有兩個。

  1. 正則表達式中不能有 unicode 字符。 相反,您需要轉義它們(例如,通過使用原始字符串): RegExp(r'\u123')
  2. 這仍然不起作用,因為現在正則表達式嘗試評估字符串中的每個字符(所以\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM