2012-03-28 23 views
9

Quiero usar \w regex para permitir el alfanumérico pero no quiero que el guión bajo _ forme parte de él. Desde _ se incluye en \w. Así que he codificado de esta manera, pero no funciona, ¿cuál es mi error?excluir el guión bajo de la expresión alfa numérica

(/^roger\w{2,3}[0-9a-z]/i) 

Estoy esperando cualquier carácter que no sea AZ o 1-2 para ser excluir

ex - roger3_2 or roger46_ or roger2_

pero

roger54 o roger4a o roger455 o rogerAAA

son para ser o k

+2

Cómo doesn ¿Funciona? Por favor, da más detalles. – Bojangles

+0

Probablemente deberías agregar entrada y salida esperada ... – Stefan

Respuesta

6
  • un punto de código numérico es \pN o \p{Number}.
  • Un punto de código de dígito es \d, \p{digit}, \p{Nd}, \p{Decimal_Number}, o \p{Numeric_Type=Decimal}.
  • Un punto de código alfabético es \p{alpha} o \p{Alphabetic}. Incluye todos los puntos de código \p{Digit}, \p{Letter} y \p{Letter_Number}, así como ciertos puntos de código \p{Mark} y \p{Symbol}.
  • Un punto de código de programación-palabra es \w, o [\p{Alphabetic}\p{Digit}\p{Mark}\p{Connector_Punctuation}].

un punto de código alfanumérico por la definición más estricta, en consecuencia, y necesariamente [\p{Alphabetic}\p{Number}], típicamente abreviado [\p{alpha}\pN].

+0

muchas gracias por la información detallada. – raindrop

23

usted podría intentar algo como:

[^_\W]+ 
+0

simple pero muy efectivo, muchas gracias !! – raindrop

3

Suponiendo que el identificador debe comenzar con un carácter alfabético, y luego puede contener cualquier número de alfa o numérico, Me gustaría hacer esto:

my $string = 'roger54a'; 
print "Match\n" if $string =~ m/\A\p{alpha}[\p{alpha}\p{Number}]*\z/; 

que ancla al principio y al final de la cadena, lo que impide cualquier caracteres que no coinciden con el conjunto específico de un solo alfa seguido de cualquier cantidad de alfa y numérico.

Actualización: Veo que tchrist acaba de dar una gran explicación de las propiedades Unicode. Esta respuesta proporciona el contexto de una expresión regular completa.

Si quería el 'alfa' que lleva a ser dos o tres dígitos seguidos de alfa-numérico, basta con añadir el cuantificador apropiado:

$string =~ m/\A\p{alpha}{2,3}[\p{alpha}\p{Number}]*\z/

Update2: Veo una definición más fuerte de lo que' Estoy buscando en un comentario a una de las respuestas aquí.Aquí está mi opinión sobre ella después de ver su aclaración:

m/\Aroger[\p{alpha}\p{Number}]{2,3}\z/

+0

muchas gracias que es muy útil – raindrop

2

Su solución propuesta:

(/^roger\w{2,3}[0-9a-z]/i) 

Medios:

\w{2,3} - 2 ó 3 caracteres alfanuméricos, incluyendo el _

[0-9a-z] (con el/i) - un solo carácter que es alfanumérico, sin incluir el _

No vi ninguna mención de los 3 caracteres alfanuméricos aceptables al principio. ¿Eso pertenece?

Tanto "roger54" como "roger4a" deberían fallar porque la expresión regular anterior requiere al menos tres caracteres después de "roger". Del mismo modo, "roger_ a" tendría éxito porque "_" pasa \ w {2,3} (específicamente \ w {3}).

Su petición sonaba como querías más de uno de estos:

es decir, "Roger" (mayúsculas y minúsculas) seguido por uno o más (+) o cero o más (*) cartas y/o números.

+0

mi pregunta está clavada, \ w {2,3} Supongo que 2 o 3 alfanuméricos estarán bien después de roger. su solución está bien pero quiero permitir solo 2 o 3 alfanuméricos no más ni menos. cómo puedo limitar eso. como dije, mi código funciona bien pero está permitido (_) así que no quiero que eso se permita. – raindrop

+0

ahh ... te conseguí ../^roger[0-9a-z]{2,3}/i trabajo. ¡¡muchas gracias!! – raindrop

+0

Me perdí la parte de solo 2 o 3 alfanuméricos después de "roger". Me alegra que lo hayas conseguido Por cierto, suponía que estabas haciendo Perl. Ya no estoy seguro, pero seguro que se parece a Perl. –

0

Estaba tratando de encontrar una solución a esto también y esta solución no funcionó para mí en C# al intentar hacer una sustitución de expresiones regulares. En caso de que alguien está buscando:

c# Regex.Replace [^\w ] that also removes underscores?

Esto es lo que yo uso en C#:

cleaned_string = Regex.Replace(input_string, @"[_]+|[^\w]+]", "");

Si desea mantener espacios:

cleaned_string = Regex.Replace(input_string, @"[_]+|[^\w\s]+", "");

Cuestiones relacionadas