2010-01-20 79 views
5

Quiero poder probar si una cadena powershell es todo letras minúsculas.comprobar cadena para todas las letras minúsculas en powershell

no soy el mejor mundos mono expresiones regulares, pero me han tratado a lo largo de estas líneas:

if($mystring -match "[a-z]^[A-Z]") { 
echo "its lower!" 
} 

Pero por supuesto que no funciona, y buscando la interwebs no me ha llegado a ninguna parte. ¿Alguien sabe la manera de hacer esto (además de probar cada personaje en un bucle)?

Respuesta

9

PowerShell por defecto se ajusta a mayúsculas y minúsculas, por lo que necesita usar el operador -cmatch:

if ($mystring -cmatch "^[a-z]*$") { ... } 

-cmatch es siempre entre mayúsculas y minúsculas, mientras que -imatch siempre es sensible a las mayúsculas.

Nota al margen: Su expresión regular también era un poco rara. Básicamente desea que el uno que he proporcionado aquí, que consiste en

  • El anchor para el inicio de la cadena (^)
  • Un character class de minúsculas letras latinas ([a-z])
  • Un quantifier, contando a repita la clase de caracteres al menos 0 veces, haciendo coincidir tantos caracteres como sea necesario (*). Puede usar + para rechazar una cadena vacía.
  • El anchor para el final de la cadena ($). Los dos anclajes se aseguran de que la expresión regular tenga que coincidir con cada carácter en la cadena. Si simplemente usara [a-z]*, esto coincidiría con cualquier cadena que tenga una cadena de al menos 0 letras minúsculas en algún lugar en ella. Que sería cada cadena.

PS: Ahmad tiene un punto, sin embargo, que si la cadena podría consistir en otras cosas que no sean letras también y usted querrá asegurarse de que cada carta en ella es menor de los casos, en lugar de que también requiere que la cadena se compone exclusivamente de letras, entonces usted tiene que invertir la clase de caracteres, tipo de:

if ($mystring -cmatch "^[^A-Z]*$") { ... } 

el ^ al inicio de la clase de caracteres invierte la clase, haciendo coincidir cada personaje no incluidos. De esta manera, esta expresión regular solo fallaría si la cadena contiene letras mayúsculas en alguna parte. Aún así, el -cmatch todavía es necesario.

+0

que funciona muy bien, gracias por la explicación adicional. – falkaholic

0

probar este patrón, que coincide con todo lo que es no una letra mayúscula: "^[^A-Z]*$"

Esto return false para cualquier letras mayúsculas al tiempo que permite la cadena para incluir otros elementos, siempre y cuando todas las letras en minúsculas. Por ejemplo, "hello world 123" sería válido.

Si estrictamente desea letras sin espacios, números, etc., entonces la solución de Johannes se ajusta.

+2

PowerShell hace coincidir las mayúsculas y minúsculas de manera predeterminada, por lo tanto, esto no puede funcionar. No sin otro operador. – Joey

5

Si la prueba es tan simple, se puede, y probablemente debe evitar el uso de expresiones regulares:

$mystring -ceq $mystring.ToLower() 
+1

wow, eso es más simple. La próxima vez estoy usando eso. – falkaholic

+0

Asegúrese de utilizar la firma sobrecargada del método aceptando un objeto 'CultureInfo' si lo necesita también. – guillermooo

+0

Probé tanto la respuesta aceptada como esta en un archivo txt con 20.643 filas y esta respuesta tomó aproximadamente la mitad del tiempo para procesar en cada ejecución que la respuesta aceptada. –

Cuestiones relacionadas