2010-01-14 24 views
12

Necesito una expresión regular que coincida con letras UTF-8 y dígitos, el signo del tablero (-) pero no coincide con los caracteres de subrayado (_), I probado estos intentos sin éxito tontas:RegEx: w - "_" + "-" en UTF-8

  • ([\w-^_])+
  • ([\w^_]-?)+
  • (\w[^_]-?)+

El \w es F taquigrafía o [A-Za-z0-9_], pero también coincide con los caracteres UTF-8 si tengo el conjunto de modificadores u.

¿Alguien me puede ayudar con esto?

+1

Sea específico con respecto a las "letras UTF-8": ¿puede confirmar que no solo desea caracteres en inglés? –

+0

@meder: quiero caracteres ** y ** acentuados/extranjeros en inglés. –

Respuesta

17

Prueba esto:

(?:[\w\-](?<!_))+ 

No un partido simple en cualquier cosa que se codifica como una \ w (o un guión) y luego tiene una búsqueda hacia atrás de anchura cero que asegura que el personaje que estaba emparejado no es un guion bajo

de lo contrario podría recoger este:

(?:[^_\W]|-)+ 

que es un enfoque más basado en el set (nótese la mayúscula W)

bien, tuve un montón de diversión con Unicode en el sabor de php de PCREs: D Peekaboo dice que hay una solución simple disponibles:

[\p{L}\p{N}\-]+ 

\ p {L} coincide con unicode nada de lo que califica como una carta (nota: no es un carácter de palabra, por lo tanto, no se subraya), mientras que \ p {N} coincide con cualquier cosa que se parece a un número (incluidos los números romanos y cosas más exóticas).
\ - es solo un guion escapado. Aunque no es estrictamente necesario, tiendo a hacer un punto de escapar de guiones en las clases de caracteres ... Tenga en cuenta, que hay docenas de diferentes guiones en Unicode, lo que daría lugar a la siguiente versión:

[\p{L}\p{N}\p{Pd}]+ 

Donde " Pd "es Punctuation Dash, que incluye, pero no se limita a, nuestro minus-dash-thingy. (Nota: de nuevo, no hay guiones bajos aquí).

+0

negar \ W no incluir hypen? – codaddict

+0

@dionadar - esto no coincide con los caracteres acentuados para mí. –

+1

@codadict Hasta donde yo sé, el guión no está incluido en \ w - e incluso si lo fuera, no estaría de más decirlo así); –

3

No estoy seguro de qué idioma usa, pero en PERL simplemente puede escribir: [[: alnum:] -] + cuando se establece la configuración regional correcta.

+0

Es bueno saberlo, pero estoy usando PHP (motor PCRE). –

+0

Lo intenté en PHP y Rubular (Ruby), vea http://www.rubular.com/regexes/12922 y http://www.rubular.com/regexes/12923. –

+0

He corregido un pequeño error allí. –