usted no puede llegar desde aquí
Tengo un regex que en este momento solo permite letras minúsculas, necesito uno que requiera letras minúsculas o mayúsculas: /(?=.*[a-z])/
Desafortunadamente, es utterly impossible to do this correctly using Javascript! Lea this flavor comparison’s ECMA column para todo lo que Javascript no puede hacer.
Teoría vs Practice
El patrón correcto para minúsculas es el estándar Unicode deriva propiedad binaria \p{Lowercase}
, y el patrón correcto para mayúsculas es igualmente \p{Uppercase}
. Estas son propiedades normativas que a veces incluyen letras que no están en letras bajo ciertas circunstancias exóticas.
Usando solo las propiedades de la categoría General, puede tener \p{Ll}
para letra minúscula, \p{Lu}
para letra mayúscula y \p{Lt}
para letra de título. Recuerde que son tres casos en Unicode, no dos). Hay un alias estándar \p{LC}
que significa [\p{Lu}\p{Lt}\p{Ll}]
.
Si desea una carta que no sea no una letra minúscula, puede usar (?=\P{Ll})\pL
. Escrito a mano, eso es (?=\P{Lowercase_Letter})\p{Letter}
. De nuevo, estos mezclan algunos de los puntos de código Other_Lowercase que reconoce \p{Lowercase}
. Debo enfatizar nuevamente que la propiedad Minúsculas es un superconjunto de la propiedad Lowercase_Letter.
Recuerda el párrafo anterior, intercambiando en la parte superior en todas las partes que escribí más abajo, y obtienes lo mismo para las mayúsculas.
plataformas posibles
Dado que el acceso a estas propiedades esenciales es el nivel mínimo de funcionalidad crítica necesaria para Unicode regular expressions, algunas versiones de Javascript a implementar en la manera que los he escrito más arriba.Sin embargo, el estándar para Javascript todavía no los requiere, por lo que, en general, no puede contar con ellos. Esto significa que es imposible hacerlo correctamente en todas las implementaciones de Javascript.
Idiomas en los que es posible hacer lo que quiere hacer mínimamente incluyen:
- C♯ y Java (ambos sólo Categorías Generales)
- Rubí si y sólo si v1.9 o mejor (sólo las propiedades binarios, incluyendo Categorías general)
- PHP y PCRE (única categoría general y de secuencias de comandos propiedades además de un par de extras)
biblioteca
- de UCI C++ y Perl, que tanto apoyo toda propiedades Unicode
De los Bove en la lista, solamente de la última línea - UCI y Perl - estrictamente y completamente cumplir con todos los requisitos de cumplimiento de nivel 1 (más algunos niveles 2 y 3) para el manejo adecuado de Unicode en expresiones regulares. Sin embargo, todos los que he enumerado en las viñetas del párrafo anterior pueden manejar fácilmente la mayoría, y muy probablemente todo, de lo que necesita.
Sin embargo, Javascript no está entre ellos. Sin embargo, su versión podría ser si tiene mucha suerte y nunca tiene que ejecutar en una plataforma de JavaScript de solo estándar.
Resumen
Así que muy tristemente, realmente no se puede utilizar expresiones regulares de JavaScript para Unicode trabajo a menos que tenga una extensión no estándar. Algunas personas lo hacen, pero la mayoría no. Si no lo hace, puede que tenga que usar una plataforma diferente hasta que el estándar ECMA relevante alcance el siglo XXI (¡Unicode 3.1 salió hace una década!).
Si alguien sabe de una biblioteca JavaScript que implementa el Nivel 1 Requisitos de UTS#18 on Unicode Regular Expressions incluyendo tanto RL1.2 “Properties” y RL1.2a “Annex C: Compatibility Properties”, favor carillón en.
¿Se da cuenta de que esta expresión regular es equivalente a '/ [az] /' y coincide con cada cadena que contiene al menos una letra minúscula? – delnan
Además, ¿cuál es el uso de los paréntesis si va a descartar ('? =') La captura de todos modos? – Martijn
@Martjin: se requieren parens para mirar hacia adelante (y muchas otras cosas) y no agrupar realmente. – delnan