Respuestas:
Desafortunadamente, por razones históricas, diferentes herramientas tienen una sintaxis de expresión regular ligeramente diferente y, a veces, algunas implementaciones tienen extensiones que no son compatibles con otras herramientas. Si bien hay un terreno común, parece que cada herramienta que escribió tomó algunas decisiones diferentes.
La consecuencia es que si tiene una expresión regular que funciona en una herramienta, es posible que deba modificarla para que funcione en otra herramienta. Las principales diferencias entre las herramientas comunes son:
+?|(){}
requieren una barra invertida;.[]*^$
y generalmente+?|()
En esta respuesta, enumero los principales estándares . Consulte la documentación de las herramientas que está utilizando para obtener detalles.
La comparación de Wikipedia de los motores de expresión regular tiene una tabla que enumera las características compatibles con implementaciones comunes.
Las expresiones regulares básicas están codificadas por el estándar POSIX . Es la sintaxis utilizada por grep
, sed
y vi
. Esta sintaxis proporciona las siguientes características:
^
y $
coinciden solo al principio y al final de una línea..
coincide con cualquier carácter (o cualquier carácter excepto una nueva línea).[…]
coincide con cualquier carácter enumerado dentro de los corchetes (conjunto de caracteres). Si el primer carácter después del paréntesis de apertura es a ^
, los caracteres que no están en la lista coinciden. Para incluir a ]
, colóquelo inmediatamente después de la apertura [
(o después [^
si es un conjunto negativo). Si -
está entre dos caracteres, denota un rango; para incluir un literal -
, colóquelo donde no pueda analizarse como un rango.^$.*\[
citas del siguiente personaje.*
coincide con el carácter anterior o subexpresión 0, 1 o más veces.\(…\)
es un grupo sintáctico, para usar con el *
operador o referencias y \DIGIT
reemplazos.\1
, \2
... coinciden con el texto exacto que coincide con el grupo correspondiente, por ejemplo, \(fo*\)\(ba*\)\1
coincide foobaafoo
pero no foobaafo
. No hay una forma estándar de referirse al décimo grupo y más allá (el significado estándar de \10
es el primer grupo seguido de a 0
).Las siguientes características también son estándar, pero faltan en algunas implementaciones restringidas:
\{m,n\}
coincide con el carácter o subexpresión anterior entre m y n veces; n o m pueden ser omitidos, y significa exactamente m .\{m\}
[[:alpha:]]
coincide con cualquier letra. Las implementaciones modernas de expresiones de paréntesis ) también incluyen elementos de clasificación como [.ll.]
clases de equivalencia como [=a=]
.Las siguientes son extensiones comunes (especialmente en herramientas GNU), pero no se encuentran en todas las implementaciones. Consulte el manual de la herramienta que está utilizando.
\|
para alternar: foo\|bar
partidos foo
o bar
.\?
(short for \{0,1\}
) y \+
(short for \{1,\}
) coinciden con el carácter o subexpresión anterior como máximo 1 vez, o al menos 1 vez respectivamente.\n
coincide con una nueva línea, \t
coincide con una pestaña, etc.\w
coincide con cualquier componente de la palabra (abreviatura [_[:alnum:]]
pero con variación cuando se trata de localización) y \W
coincide con cualquier carácter que no sea un componente de la palabra.\<
y hacer \>
coincidir la cadena vacía solo al principio o al final de una palabra respectivamente; \b
coincide con cualquiera, y \B
coincide con donde \b
no.Tenga en cuenta que las herramientas sin el \|
operador no tienen todo el poder de las expresiones regulares. Las referencias posteriores permiten algunas cosas adicionales que no se pueden hacer con expresiones regulares en el sentido matemático.
Las expresiones regulares extendidas están codificadas por el estándar POSIX . Su principal ventaja sobre BRE es la regularidad: todos los operadores estándar son caracteres de puntuación, una barra diagonal inversa antes de que un carácter de puntuación siempre lo cite. Es la sintaxis utilizada por awk
, grep -E
o egrep
, GNU sed -r
, y el=~
operador de bash . Esta sintaxis proporciona las siguientes características:
^
y $
coinciden solo al principio y al final de una línea..
coincide con cualquier carácter (o cualquier carácter excepto una nueva línea).[…]
coincide con cualquier carácter enumerado dentro de los corchetes (conjunto de caracteres). La complementación con una inicial ^
y rangos funcionan como en BRE (ver arriba). Se pueden usar clases de caracteres, pero faltan algunas implementaciones. Las implementaciones modernas también admiten clases de equivalencia y elementos de clasificación. Una barra diagonal inversa entre paréntesis cita el siguiente carácter en algunas implementaciones, pero no en todas; se utiliza \\
para significar una barra invertida para la portabilidad.(…)
es un grupo sintáctico, para uso con *
o \DIGIT
reemplazos.|
para alternar: foo|bar
partidos foo
o bar
.*
, +
y ?
coincide con el carácter o subexpresión anterior varias veces: 0 o más para *
, 1 o más para +
, 0 o 1 para ?
.{m,n}
coincide con el carácter anterior o subexpresión entre m y n veces (que faltan en algunas implementaciones); n o m pueden ser omitidos, y significa exactamente m .{m}
\DIGIT
$0 ~ "(...)\\1"
\n
\t
\b
\B
\b
\B
PCRE son extensiones de ERE, introducidas originalmente por Perl y adoptadas por GNU grep -P
y muchas herramientas modernas y lenguajes de programación , generalmente a través de la biblioteca PCRE . Consulte la documentación de Perl para obtener un formato agradable con ejemplos. PCRE no admite todas las funciones de la última versión de Perl (por ejemplo, la ejecución del código Perl solo es compatible con Perl). Consulte el manual de PCRE para ver un resumen de las funciones compatibles. Las principales adiciones a ERE son:
(?:…)
es un grupo que no captura: me gusta (…)
, pero no cuenta para las referencias posteriores.(?=FOO)BAR
(búsqueda anticipada) coincide BAR
, pero solo si también hay una coincidencia para FOO
comenzar en la misma posición. Esto es más útil para anclar una coincidencia sin incluir el siguiente texto en la coincidencia: foo(?=bar)
coincidencias foo
pero solo si es seguido por bar
.(?!FOO)BAR
(búsqueda anticipada negativa) coincide BAR
, pero tampoco existe una coincidencia FOO
en la misma posición. Por ejemplo, (?!foo)[a-z]+
coincide con cualquier palabra en minúscula que no comience con foo
; [a-z]+(?![0-9)
coincide con cualquier palabra en minúscula que no sea seguida por un dígito (por lo tanto foo123
, coincide fo
pero no foo
).(?<=FOO)BAR
(mirar atrás) coincide BAR
, pero solo si está precedido inmediatamente por una coincidencia para FOO
. FOO
debe tener una longitud conocida (no puede usar operadores de repetición como *
). Esto es más útil para anclar una coincidencia sin incluir el texto anterior en la coincidencia: (?<=^| )foo
coincide foo
pero solo si está precedida por un espacio o por el comienzo de la cadena.(?<!FOO)BAR
(retroceso negativo) coincide BAR
, pero solo si no está precedido inmediatamente por una coincidencia para FOO
. FOO
debe tener una longitud conocida (no puede usar operadores de repetición como *
). Esto es más útil para anclar una coincidencia sin incluir el texto anterior en la coincidencia: (?<![a-z])foo
coincidencias, foo
pero solo si no va precedida de una letra minúscula.La sintaxis de Emacs es intermedia entre BRE y ERE. Además de Emacs, es la sintaxis predeterminada para -regex
GNU find. Emacs ofrece los siguientes operadores:
^
, $
, .
, […]
, *
, +
, ?
Como en el ERE\(…\)
, \|
, \{…\}
, Como en BRE\DIGIT
\<
y \>
para límites de palabras; y más en versiones recientes de Emacs, que a menudo no son compatibles con otros motores con una sintaxis similar a Emacs.Los globos de shell (comodines) realizan la coincidencia de patrones con una sintaxis que es completamente diferente de las expresiones regulares y menos potente. Además de los shells, estos comodines están disponibles con otras herramientas, como los find -name
filtros rsync. Los patrones POSIX incluyen las siguientes características:
?
coincide con cualquier personaje individual.[…]
es un conjunto de caracteres como en las sintaxis comunes de expresiones regulares. Algunos proyectiles no admiten clases de personajes. Algunos proyectiles requieren en !
lugar de ^
negar el conjunto.*
coincide con cualquier secuencia de caracteres (a menudo, excepto /
cuando coinciden las rutas de archivos; si /
se excluye *
, a **
veces se incluye /
, pero consulte la documentación de la herramienta).Ksh ofrece características adicionales que le dan a su patrón que coincide con el poder total de las expresiones regulares. Estas características también están disponibles en bash después de ejecutarse shopt -s extglob
. Zsh tiene una sintaxis diferente pero también puede admitir la sintaxis de ksh después setopt ksh_glob
.
grep
, tw
, expr
...). Excepto que ksh
, ese conjunto de herramientas rara vez se encuentra fuera de AT&T.
regex(7)
está de acuerdo con usted y llama [these]
"expresiones de paréntesis" y (dentro de "expresiones de paréntesis") [:these:]
"clases de caracteres". No estoy seguro de cómo abordarlo mejor.
-
especifica un rango y debe ser escapado, primero (después de lo opcional ^
), o último si debe tomarse literalmente. (He visto muchos errores derivados de, p. Ej., [A-z]
Tenga en cuenta el cambio en mayúsculas y minúsculas), que coincide con los caracteres de los códigos 65 a 122 e incluye accidentalmente cada uno de los siguientes [\]^_`
. También he visto el válido pero confuso [!-~]
para coincidir con todos los caracteres imprimibles en ANSI , que prefiero ver como [\x21-\x7e]
, que es al menos directo en su acción, aunque confuso en una dimensión diferente.)
vim
los libast de AT&T (como enksh93
).