2010-01-23 11 views
6

tuve esta expresión regular en java que coincide bien un carácter alfanumérico o la tilde (~)Matching '_' y '-' en Java expresiones regulares

^([a-z0-9])+|~$

Ahora tengo que añadir también la - caracteres y _ he intentado un par de combinaciones, ninguno de los cuales trabajan, por ejemplo:

^([a-zA-Z0-9_-])+|~$ ^([a-zA-Z0-9]|-|_)+|~$

Muestra las cadenas de entrada que deben coincidir:

woZOQNVddd

ncnW0mL14-

dEowBO_Eu7

7MyG4XqFz-

A8ft-y6hDu ~

¿Alguna pista/sugerencia?

+0

¿Nos puede proporcionar algunas muestras de prueba? Sus soluciones parecen correctas. – Leo

+0

muestras añadidas.Tenga en cuenta que he agregado A-Z para que coincida con las letras mayúsculas –

+0

Dios odio las expresiones regulares en java: @ –

Respuesta

7

- es un carácter especial entre corchetes. Indica un rango Si no está en ninguno de los extremos de la expresión regular, debe escaparse colocando un \ antes.

Vale la pena señalar un acceso directo: \w es equivalente a [0-9a-zA-Z_] así que creo que esto es más fácil de leer:

^([\w-]+|~$ 
+0

En realidad tuve un error tipográfico. Funciona, gracias –

+0

+1 - De alguna manera se había escapado (sin juego de palabras) mi aviso de que '\ w' también coincidiría con un carácter' _'. Supongo que es así que podemos usarlo para unir nombres de variables realmente malos. –

+1

@Bill: a menudo se olvida o se desconoce. Es extraño. Creo que preferiría que ese no fuera el caso, porque no he usado '\ w' muchas veces debido a eso, pero es fácil de hacer' \ w_' si es necesario. Y creo que la mayoría de las veces no te importa '_'. – cletus

3

Necesita escapar de -, como \-, ya que es un carácter especial (el operador de rango). _ está bien.

Así ^([a-z0-9_\-])+|~$.

Editar: la cadena de la última entrada no coincidir debido a que la expresión regular que está utilizando coincide con una cadena de caracteres alfanuméricos (más - y _) o una tilde (a causa de la tubería). Pero no ambos. Si desea permitir una tilde opcional en el extremo, cambiará a:

^([a-z0-9_\-])+(~?)$

+0

O podría poner el guión como el primer caracter que le dice al analizador que no lo considere un delimitador de rango. –

+0

Probado usando '^ ([a-zA-Z0-9 _ \\ -]) + | ~ $'. No funciona –

+0

@Max intentó '^ ([- a-zA-Z0-9 _]) + | ~ $'. No funciona –

3

Si se pone la primera -, no se puede interpretar como el indicador de rango.

^([-a-zA-Z0-9_])+|~$ 

Esto coincide con todos sus ejemplos, excepto la última usando el siguiente código:

String str = "A8ft-y6hDu ~"; 
System.out.println("Result: " + str.matches("^([-a-zA-Z0-9_])+|~$")); 

Ese último ejemplo no coincidirá porque no se ajusta a su descripción. La expresión regular coincidirá con cualquier combinación de caracteres alfanuméricos, - y _, O ~.

+0

falla en 'ncnW0mL14-' –

+0

Eso es porque aún no había agregado la A-Z. Coincide ahora. –

+0

¡Gracias @ bill que funciona! (Estoy usando @ cletus, ya que es más sucinto) –

Cuestiones relacionadas