2011-03-09 14 views
8

para que coincida con lo siguiente:¿Cómo puedo hacer que parte de una expresión regular sea opcional en Ruby?

On Mar 3, 2011 11:05 AM, "mr person" 
wrote: 

tengo la siguiente expresión regular:

/(On.* (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2}, [12]\d{3}.* at \d{1,2}:\d{1,2} (?:AM|PM),.*wrote:)/m 

¿Hay una manera de hacer que el por lo opcional? entonces, si está ahí genial, si no, ¿aún coincide?

+1

+1 negando el -1, simplemente no creo que sea correcto, perdón ... – sln

+0

@sln: ¿Te refieres a "negar"? Además, ¿por qué siente que el voto a favor no está justificado? –

Respuesta

11

Sure. Póngalo entre paréntesis, ponga un signo de interrogación después. Incluya uno de los espacios (ya que de lo contrario, intentará hacer coincidir dos espacios si falta la "a".) (at)? (o como sugirió otra persona, (?:at)? para evitar que se capture).

+0

Probé eso, no funciona – AnApprentice

+0

oh espera, fue porque tenía un espacio, después. gracias – AnApprentice

+0

También deberá incluir un espacio allí, ya que de lo contrario tratará de hacer coincidir dos espacios. Voy a editar – kindall

10

No se olvide (?:) para asegurarse de que la expresión entre corchetes no quede capturado

(?:at)? 
+0

Esto también funciona para expresiones complejas, p. Ej./(\ w + (\ [\ w + \] (?: \ [\ d + \])?) +) (?: \ [\ w + \]) /; – Donato

+0

Nunca supe cómo no ser capturado cuando usé parens para elementos opcionales, ¡gracias! –

1

Claro, sólo tiene que agrupar la parte opcional ...

(at)* 

Y, OK , Supongo que coincidirá con en at at a, por lo que es posible que desee hacer:

(at)? 
+0

Eso debería ser un '?', No un '*'. –

+0

+1 para la edición! –

2

Otros obtuvieron su respuesta. Esto es solo un re aparte: Expresiones regulares.

Cuando dice "condiciones" en expresiones regulares, se refiere al lenguaje de expresiones regulares. Como cualquier lenguaje, es una rama en la ejecución de código, pero el código es una ruta de expresión regular diferente, el "código" de expresiones regulares.

Por lo tanto, en el código de psudo: if (la evaluación es verdadera) haga esta sub-expresión regular, sino haga esta otra subexpresión.

Este condicional existe en los motores avanzados de expresiones regulares ... Perl.
Perl usa el motor de expresiones regulares más avanzado que existe. En la versión 6 y más allá, será una parte integral del lenguaje, donde el código y la expresión se entremezclan sin problemas.

Perl 5.10 tiene esta construcción:
(? (Condición) yes-pattern | no-pattern).

Editar Solo una advertencia de que donde va Perl, cada dos idiomas sigue en cuanto a la expresión regular.

+0

+1. Seguí adelante y edité la pregunta para usar "opcional" en su lugar. –

Cuestiones relacionadas