Si quiero usar las expresiones regulares de C++ 11 con cadenas unicode, ¿funcionarán con char * como UTF-8 o tendré que convertirlas a una cadena wchar_t *?¿Las expresiones regulares de C++ 11 funcionan con cadenas UTF-8?
Respuesta
Debería probar su compilador y el sistema que está utilizando, pero, en teoría, será compatible si su sistema tiene una configuración regional UTF-8. La prueba siguiente volvió cierto para mí en Clang/OS X.
bool test_unicode()
{
std::locale old;
std::locale::global(std::locale("en_US.UTF-8"));
std::regex pattern("[[:alpha:]]+", std::regex_constants::extended);
bool result = std::regex_match(std::string("abcdéfg"), pattern);
std::locale::global(old);
return result;
}
NOTA: Este fue compilado en un archivo de lo que era codificación UTF-8.
Solo para estar seguro, también usé una cadena con las versiones hexadecimales explícitas. Funcionó también.
bool test_unicode2()
{
std::locale old;
std::locale::global(std::locale("en_US.UTF-8"));
std::regex pattern("[[:alpha:]]+", std::regex_constants::extended);
bool result = std::regex_match(std::string("abcd\xC3\xA9""fg"), pattern);
std::locale::global(old);
return result;
}
actualizacióntest_unicode()
todavía funciona para mí
$ file regex-test.cpp
regex-test.cpp: UTF-8 Unicode c program text
$ g++ --version
Configured with: --prefix=/Applications/Xcode-8.2.1.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode-8.2.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
No necesita guardar el código fuente en UTF-8 si usa 'u8" abcdéfg "'. –
¿Es tan importante la configuración regional? Si ignoras la locale en absoluto? – Viet
@Viet Siempre hay una configuración regional. Si no establece explícitamente la configuración regional que necesita, entonces regex procesará con la configuración regional preexistente. No esperaría que la expresión regular funcione con cadenas UTF-8 si la configuración regional no es compatible con UTF-8. –
C++ 11 expresiones regulares "funcionan con" UTF-8 muy bien, para una definición mínima de "trabajo". Si quieres compatibilidad con expresiones regulares Unicode "completas" para cadenas UTF-8, estarás mejor con una biblioteca que admita eso directamente, como http://www.pcre.org/.
O [Boost.Regex] (http://www.boost.org/libs/regex/). – ildjarn
@ildjarn: ... que necesita [ICU] (http://site.icu-project.org/) soporte compilado, que desafortunadamente no es la regla en todas las plataformas, y puede ser bastante ab **** para Ponte a trabajar. ICU, sin embargo, tiene soporte para RegEx propio ... – DevSolar
Sí lo harán, esto es por diseño de la codificación UTF-8. Las operaciones de subcadena deberían funcionar correctamente si la cadena se trata como una matriz de bytes en lugar de una matriz de puntos de código.
Consulte la Pregunta frecuente n. ° 18 aquí: http://www.utf8everywhere.org/#faq.validation acerca de cómo se logra esto en el diseño de esta codificación.
La coincidencia de expresiones regulares no es una "operación de subcadena". –
- 1. No coincide con C++ 11 expresiones regulares
- 2. formato de cadenas con expresiones regulares en C#
- 3. Java - extraer cadenas con expresiones regulares
- 4. ¿Cómo funcionan las expresiones regulares en el selenio?
- 5. expresiones regulares en Javascript con jQuery Contiene expresiones regulares extensión
- 6. ¿Correspondencia de expresiones regulares entre dos cadenas?
- 7. Cómo usar expresiones regulares para utf8 en ruby
- 8. Las expresiones regulares en C preprocesador macro
- 9. nulabilidad (Las expresiones regulares)
- 10. Coincidencia de "principio de línea" con libC++ biblioteca de expresiones regulares (C++ 11)
- 11. Expresiones regulares C++ Qt
- 12. búsqueda de Ruby matrices con expresiones regulares Las expresiones
- 13. Expresiones regulares en C
- 14. ¿Es posible tener expresiones regulares que coincidan con todas las expresiones regulares válidas?
- 15. C++ expresiones regulares con Boost Regex
- 16. caso Matching cadenas Unicode sensibles con expresiones regulares en Python
- 17. Cómo dividir cadenas utilizando expresiones regulares
- 18. ¿Por qué las expresiones regulares se llaman expresiones "regulares"?
- 19. Expresiones regulares en C++ STL
- 20. Eliminar caracteres con expresiones regulares en C#
- 21. de expresiones regulares negativo
- 22. ¿Se detienen todas las expresiones regulares?
- 23. Expresiones regulares en C: ejemplos?
- 24. ¿Debo evitar las expresiones regulares?
- 25. ¿Cómo dominar las expresiones regulares?
- 26. Multiplicación con expresiones regulares .NET
- 27. Expresiones regulares difusas
- 28. Expresiones regulares en C# ejecutando lentamente
- 29. Correspondencia de expresiones regulares de cadenas en Erlang
- 30. Uso de expresiones regulares para filtrar cadenas por longitud
¿Detecto una confusión acerca de los puntos Unicode/code y los esquemas de codificación de Unicode aquí? –
http://icu-project.org/apiref/icu4c/classUnicodeString.html –