2009-10-28 12 views

Respuesta

19

No hay mucha diferencia en su ejemplo de arriba (en la mayoría de los idiomas). La principal diferencia es que la versión () crea un grupo que puede ser referenciado por \1 en la coincidencia (o, a veces, $1). La versión [] no hace esto.

Además,

/(ab|cd)/ # matches 'ab' or 'cd' 
/[abcd]/ # matches 'a', 'b', 'c' or 'd' 
+2

() también se utilizan para denotar grupos nombrados, para su reutilización –

+0

@rexem - Sí, pensó en esto antes de su comentario y lo editó :) – Peter

+0

Me acaba de ser pedante =) –

5

En primer lugar, cuando se habla de expresiones regulares, a menudo es importante especificar qué tipo de expresiones regulares que estás hablando. Hay varias variaciones (como las expresiones regulares tradicionales POSIX, las expresiones regulares compatibles con Perl y Perl (PCRE), etc.).

Suponiendo PCRE o algo muy similar, lo que suele ser la más común en estos días, hay tres diferencias fundamentales:

  1. Uso de grupos entre paréntesis, puede comprobar las opciones que consisten en más de un carácter. Entonces/(a ​​| b)/podría ser/(abc | defg) /.
  2. Los grupos entre paréntesis realizan una operación de captura para que pueda extraer el resultado (de modo que si coincide con "b", puede recuperar "b" y ver eso)./[ab]/no. La operación de captura puede anularse agregando?: Como lo que sigue:/(?: a | b)/
  3. Incluso si anula el comportamiento de captura de paréntesis, la implementación subyacente aún puede ser más rápida para [] cuando está comprobando los caracteres individuales (aunque nada dice que no capturar (?: a | b) no se pueden optimizar como un caso especial en [ab], pero la compilación regex puede demorar un poco más).
6

() en expresión regular se utiliza para agrupar expresiones regulares, lo que le permite aplicar operadores a una expresión completa en lugar de a un solo carácter. Por ejemplo, si tengo la expresión regular ab, entonces ab* se refiere a un a seguido de cualquier número de b s (por ejemplo, a, ab, abb, etc), mientras que (ab)* se refiere a cualquier número de repeticiones de la secuencia de ab (por ejemplo, la cadena vacía, ab, abab, etc.). En muchos motores de expresiones regulares, () también se usan para crear referencias a las que se puede hacer referencia después de la coincidencia. Por ejemplo, en Ruby, después de ejecutar "foo" =~ /f(o*)/, $1 contendrá oo.

| en una expresión regular indica la alternancia; significa la expresión antes de la barra, o la expresión después de ella. Puede hacer coincidir cualquier dígito con la expresión 0|1|2|3|4|5|6|7|8|9. Con frecuencia verá la alternancia envuelta en un conjunto de paréntesis para agrupar o capturar una sub-expresión, pero no es necesaria. También puede usar la alternancia en expresiones más largas, como foo|bar, para indicar foo o bar.

Usted puede expresar cada expresión regular (en el sentido teórico formal, no el sentido extendido que muchos lenguajes usan), con sólo la alternancia |, el cierre kleene *, la concatenación (sólo escribir dos expresiones uno junto al otro sin nada en entre), y paréntesis para agrupar.Pero eso sería bastante inconveniente para las expresiones complicadas, por lo que varios shorthands están comúnmente disponibles. Por ejemplo, x? es solo una abreviatura de |x (es decir, la cadena vacía o x), mientras que y+ es una abreviatura de yy*.

[] son básicamente una abreviatura de la alternancia | de todos los caracteres, o rangos de caracteres, dentro de ella. Como dije, podría escribir 0|1|3|4|5|6|7|8|9, pero es mucho más conveniente escribir [0-9]. También puedo escribir [a-zA-Z] para representar cualquier letra. Tenga en cuenta que aunque [] proporcionan agrupación, generalmente no introducen una nueva referencia a la que se pueda hacer referencia más adelante; que tendría que envolverlos en paréntesis para que, al igual ([a-zA-Z])

Así, los dos ejemplos de expresiones regulares son equivalentes en lo que coinciden, pero el (a|b) fijarán el primer sub-coincidencia con el carácter concordante, mientras [ab] no lo hará crea cualquier referencia a sub-matches.

Cuestiones relacionadas