Tengo esta expresión regular:
RegExp(r'[\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}]'); Cuando estoy usando este RegExp en https://regex101.com , está funcionando. Pero cuando estoy usando este RegExp en Dart, obtengo un Range out of order in character class (tenga en cuenta que lo mismo sucede cuando lo intento usando el equivalente de RegExp en JavaScript).
Estoy realmente seguro de que se trata de un error de escape de cadena, pero no puedo encontrar el problema.
Ya probé una cadena sin procesar en Dart ( r'...' ), escapando de \ en \u{1f300} → \\u{1f300} , sin embargo, ninguno funciona.
Como se señaló en los comentarios, la coincidencia de caracteres Unicode requiere el indicador Unicode en expresiones regulares.
Si intenta simplemente hacer coincidir un carácter Unicode usando RegExp('\u123') , esto fallará por dos razones.
RegExp(r'\u123') .\ , u , etc.). Aquí es donde entra en juego labandera unicode : RegExp('\u123', unicode: true) . Tenga en cuenta que para los caracteres Unicode de 3 bytes, deberá agregar llaves, por ejemplo, RegExp(r'u\{1f300}' . Consulte esta pregunta para obtener más información.
Esto significa que su expresión regular final debería verse así:
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, ); Otro problema que puede encontrar es que no podrá hacer coincidir los emojis que abarcan varios caracteres con la expresión regular inicial. Tenga en cuenta que en el fragmento anterior, agregué un + al final para hacer coincidir los emojis que abarcan varios caracteres.
Para ahora hacer coincidir emojis individuales, querrá ejecutar la expresión regular en cada carácter de la cadena, definida por grupos de grafemas . Esto se puede lograr usando package:characters .