2011-02-02 9 views
5

tengo una expresión regular que en este momento sólo permite que las letras minúsculas, necesito uno que requiere tanto letras mayúsculas o minúsculas:necesitan una expresión regular JavaScript que requiere letras mayúsculas o minúsculas

/(?=.*[a-z])/ 
+2

¿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

+0

Además, ¿cuál es el uso de los paréntesis si va a descartar ('? =') La captura de todos modos? – Martijn

+0

@Martjin: se requieren parens para mirar hacia adelante (y muchas otras cosas) y no agrupar realmente. – delnan

Respuesta

7

Trate /(?=.*[a-z])/i

Nota el i al final, esto hace que la expresión no sea sensible.

+0

Realmente siento que Platinum Azure dio la mejor respuesta aquí. – Leigh

+0

Ese patrón no coincide con 1723 letras minúsculas. – tchrist

+2

Sea como fuere, el OP aceptó su respuesta porque respondió su pregunta. Solo tienes que ir :-) –

2

O agregar un intervalo de mayúsculas a su expresión regular:

/(?=.*[a-zA-Z])/ 
+1

Esa no es la forma en que uno coincide con letras mayúsculas. O en minúsculas, para el caso. Es un enfoque horrible de los años 60. Tiene al menos 20 años de antigüedad y no tiene cabida en el procesamiento de texto moderno. – tchrist

+2

@tchrist - bonito, década de 1960, 20 años, genial. Explicación por favor? Amablemente ayúdame a mejorar mis expresiones regulares. – karim79

+0

ASCII de 7 bits apareció en los años 60. Unicode ahora tiene 20 años y los códigos ISO 8859 son más antiguos. ASCII es demasiado vieja para servir al mundo hoy. La web es * no * ¡ASCII! – tchrist

16

No estoy seguro si quieres decir con mayúsculas y minúsculas, o estrictamente minúscula, más estrictamente mayúsculas.

Aquí está la versión en mayúsculas y minúsculas:

/^[a-zA-Z]+$/ 

Y lo estrictamente sola o la otra versión:

/^([a-z]+|[A-Z]+)$/ 
+0

Buena llamada, no consideré que se solicitara la segunda versión. – Leigh

+0

Factorizaría los anclajes en el segundo ('^ ([a-z] + | [A-Z] +) $', pero por lo demás lo que habría sugerido. +1 – delnan

+0

@Leigh: no estaba seguro, la pregunta no estaba clara. He visto todo tipo de preguntas aquí :-) –

18

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.

+1

Debería haber sabido que estarías escribiendo el tratado. :-) Mi única respuesta es que no hay ninguna indicación en la pregunta de que el OP se preocupe por Unicode o i18n. :-) –

+1

i18n es irrelevante. Supongamos que todos los 7, pero hardcodings están equivocados por defecto a menos que se demuestre lo contrario. Bienvenido a los últimos 20 años! – tchrist

+0

* encogimiento de hombros * Bastante. No te devolví, por cierto. –

Cuestiones relacionadas