Respuesta
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'
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:
- 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) /.
- 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)/
- 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).
()
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.
- 1. ¿Cuál es la diferencia entre \ 1 y $ 1 en una expresión regular de Perl?
- 2. ¿Cuál es la diferencia entre corchetes y paréntesis en una expresión regular?
- 3. ¿Cuál es la diferencia entre \ z y \ Z en una expresión regular y cuándo y cómo la uso?
- 4. ¿Cuál es la diferencia entre MacVim y Vim regular?
- 5. ¿Cuál es la diferencia entre los cuantificadores de expresión regular `Greedy` y` Reluctant`?
- 6. Cuál es la diferencia en Perl al pasar una variable en una expresión regular entre usar $ variable y $ {variable}
- 7. ¿cuál es la diferencia entre la lex y yacc
- 8. ¿Cuál es la diferencia entre [\ s \ S] *? y. *?
- 9. ¿Cuál es la diferencia entre vim regex y regex normal?
- 10. ¿Cuál es la expresión regular más eficiente?
- 11. ¿Cuál es la expresión regular de una palabra en español?
- 12. ¿Cuál es la diferencia de enunciado y expresión en Ruby?
- 13. ¿Cuál es la diferencia entre grep y map en Perl?
- 14. ¿Cuál es la diferencia entre dict() y {}?
- 15. ¿Cuál es la diferencia entre una expresión lambda y un predicado en .NET?
- 16. ¿Cuál es la diferencia entre ".equals" y "=="?
- 17. ¿Cuál es la diferencia entre {0} y ""?
- 18. ¿Cuál es la diferencia entre .ToString (+) y ""
- 19. ¿Cuál es la expresión regular para una URL como esta?
- 20. ¿Cuál es la diferencia entre + = y = +?
- 21. ¿cuál es la diferencia entre:.! y: r !?
- 22. Cuál es la diferencia entre $ y jQuery
- 23. Cuál es la diferencia entre = y: =
- 24. Cuál es la diferencia entre $ (...) y `...`
- 25. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 26. ¿cuál es la diferencia entre una clase y una biblioteca?
- 27. ¿Cuál es la diferencia entre una vista y una secuencia?
- 28. ¿Cuál es la diferencia entre " " y ""?
- 29. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 30. ¿Cuál es la diferencia entre "$^N" y "$ +"?
() también se utilizan para denotar grupos nombrados, para su reutilización –
@rexem - Sí, pensó en esto antes de su comentario y lo editó :) – Peter
Me acaba de ser pedante =) –