¿Cómo hacer coincidir los guiones con la expresión regular?

81

¿Cómo reescribir el [a-zA-Z0-9!$* \t\r\n]patrón para que coincida con el guión junto con los caracteres existentes?

Thomas Anderson
fuente
en lugar de agregar el espacio y \ t, puede agregar \ s. \ s también coincide con otros tipos de espacios en blanco
Radu Simionescu

Respuestas:

71

Escapa del guión.

[a-zA-Z0-9!$* \t\r\n\-]

ACTUALIZACIÓN :
No importa esta respuesta: puede agregar el guión al grupo, pero no tiene que escapar de él. En su lugar, vea la respuesta de Konrad Rudolph, que responde mucho mejor y explica por qué.

Neil Barnwell
fuente
Oh, lo es? ¿Es eso porque está en un grupo de personajes? Culpa mía.
Neil Barnwell
11
@KonradRudolph Tienes razón, pero no estoy seguro de que la versión sin escape sea más fácil de entender. Los dos posibles usos del guión son confusos, por eso, para empezar, hay preguntas sobre esto. Sin duda, es más elegante una vez que lo conoces, pero para los principiantes es un poco confuso.
Christophe Roussy
183

El guión suele ser un carácter normal en expresiones regulares. Solo si está en una clase de personaje y entre otros dos personajes, adquiere un significado especial.

Así:

  • [-] coincide con un guion.
  • [abc-]partidos a, b, co un guión.
  • [-abc]partidos a, b, co un guión.
  • [ab-d]partidos a, b, co d( sólo que aquí el guión indica un intervalo de caracteres).
Konrad Rudolph
fuente
1
@rrr ¿Quieres que él te lo escriba y lo deletree? Todo lo que necesita hacer es agregar el guión al grupo.
Neil Barnwell
10
@rrrr: Creo que he dado una respuesta. La pregunta era “cómo escribir 'X'…” y creo que ya he explicado cómo hacerlo. Tomar mi respuesta y aplicar la explicación a la expresión real en cuestión no debería requerir más habilidad cognitiva de la que se requiere de un estudiante de primer grado. De hecho, esto es exactamente lo que los estudiantes de primer grado aprenden a hacer cuando se les enseña aritmética básica. Siéntase libre de corregir mi suposición.
Konrad Rudolph
2
@MarkP Bueno, claro: los códigos hexadecimales de caracteres son convertidos por el analizador de front-end (de C #, JavaScript o cualquier idioma que esté usando) en el carácter real. Entonces, usar códigos hexadecimales es lo mismo que usar los caracteres reales en lo que respecta al valor de la cadena.
Konrad Rudolph
1
@Pshemo Por supuesto, estúpido error. Con respecto a la interpretación en [a-c-e]: esto simplemente no es válido en algunas especificaciones / motores de expresiones regulares. POSIX regex, por ejemplo, no lo permite.
Konrad Rudolph
12

Es menos confuso usar siempre un guión de escape, para que no tenga que ser posicionalmente dependiente. Eso es \-dentro de la clase de caracteres entre corchetes.

Pero hay algo más a considerar. Algunos de esos caracteres enumerados posiblemente deberían escribirse de manera diferente. En algunas circunstancias, definitivamente deberían hacerlo.

Esta comparación de sabores de expresiones regulares dice que C♯ puede usar algunas de las propiedades Unicode más simples. Si está tratando con Unicode, probablemente debería usar la categoría general \p{L}para todas las letras posibles y tal vez \p{Nd} para números decimales. Además, si desea acomodar toda esa puntuación de guión, no solo GUIÓN MENOS, debe usar la \p{Pd}propiedad. Es posible que también desee escribir esa secuencia de caracteres en blanco simplemente como \s, asumiendo que no es demasiado general para usted.

En conjunto, eso resulta en un patrón de [\p{L}\p{Nd}\p{Pd}!$*]coincidir con cualquier carácter de ese conjunto.

Probablemente usaría eso de todos modos, incluso si no planeaba lidiar con el conjunto completo de Unicode, porque es un buen hábito para adquirir y porque estas cosas a menudo crecen más allá de sus parámetros originales. Ahora, cuando lo levante para usarlo en otro código, seguirá funcionando correctamente. Si codifica todos los caracteres, no lo hará.

tchrist
fuente
Tiendo a estar de acuerdo con esta respuesta, cuanto menos necesita saber, más seguro es el código. Esto me recuerda las prioridades de los operadores de problemas: stackoverflow.com/questions/10007140/… , prefiero tener paréntesis en ellos (agregados automáticamente por mi IDE), no es necesario conocerlos todos. Usted u otra persona pueden equivocarse tarde o temprano. Por supuesto, si trabaja mucho con expresiones regulares en sus proyectos, es posible que necesite tener conocimientos más avanzados.
Christophe Roussy
4

[-a-z0-9] +, [a-z0-9 -] +, [az-0-9] + y también [az-0-9] + son todos iguales. El guión entre dos rangos considerados como un símbolo. Y también [a-z0-9 - + ()] + esta expresión regular permite guión.

Parimala
fuente
Debería ser una de las mejores respuestas.
Razor's Edge
3

¿Es esto lo que buscas?

MatchCollection matches = Regex.Matches(mystring, "-");
Aliostad
fuente
1

use "\ p {Pd}" sin comillas para coincidir con cualquier tipo de guión. El carácter '-' es solo un tipo de guión que también es un carácter especial en Regex.

Radu Simionescu
fuente