Regular Expressions
Modificadores de expresiones regulares (banderas)
Buscar..
Introducción
Los patrones de expresión regular a menudo se usan con modificadores (también llamados indicadores ) que redefinen el comportamiento de expresiones regulares. Los modificadores Regex pueden ser regulares (por ejemplo, /abc/i
) y en línea (o incrustados ) (por ejemplo, (?i)abc
). Los modificadores más comunes son los modificadores globales, que no distinguen entre mayúsculas y minúsculas, multilínea y dotall. Sin embargo, los tipos de expresión regular difieren en el número de modificadores de expresión regular admitidos y sus tipos.
Observaciones
Modificadores PCRE
Modificador | En línea | Descripción |
---|---|---|
PCRE_CASELESS | (?yo) | Coincidencia insensible al caso |
PCRE_MULTILINE | (?metro) | Coincidencia de líneas múltiples |
PCRE_DOTALL | (? s) | . une nuevas lineas |
PCRE_ANCHORED | (?UNA) | Meta-carácter ^ coincide solo al inicio |
PCRE_EXTENDED | (?X) | Los espacios en blanco son ignorados |
PCRE_DOLLAR_ENDONLY | n / A | Meta-carácter $ coincide solo al final |
PCRE_EXTRA | (?X) | Estricto escape de análisis |
PCRE_UTF8 | Maneja caracteres UTF-8 | |
PCRE_UTF16 | Maneja caracteres UTF-16 | |
PCRE_UTF32 | Maneja caracteres UTF-32 | |
PCRE_UNGREEDY | (? U) | Configura el motor para una coincidencia perezosa. |
PCRE_NO_AUTO_CAPTURE | (? :) | Desactiva los grupos de auto captura |
Modificadores de Java
Modificador ( Pattern.### ) | Valor | Descripción |
---|---|---|
UNIX_LINES | 1 | Habilita el modo de líneas Unix . |
CASE_INSENSITIVE | 2 | Permite la coincidencia entre mayúsculas y minúsculas. |
COMENTARIOS | 4 | Permite espacios en blanco y comentarios en un patrón. |
MULTILINE | 8 | Habilita el modo multilínea. |
LITERAL | dieciséis | Habilita el análisis literal del patrón. |
DOTALL | 32 | Habilita el modo dotall. |
UNICODE_CASE | 64 | Habilita el plegado de casos conscientes de Unicode. |
CANON_EQ | 128 | Habilita la equivalencia canónica. |
UNICODE_CHARACTER_CLASS | 256 | Habilita la versión Unicode de clases de caracteres predefinidas y clases de caracteres POSIX. |
Modificador DOTALL
Un patrón de expresiones regulares donde un modificador DOTALL (en la mayoría de los sabores de expresiones regulares expresado con s
) cambia el comportamiento de .
habilitándolo para que coincida con un símbolo de nueva línea (LF):
/cat (.*?) dog/s
Esta expresión regular al estilo de Perl coincidirá con una cadena como "cat fled from\na dog"
capturando "fled from\na"
al Grupo 1.
Una versión en línea: (?s)
(por ejemplo, (?s)cat (.*?) dog
)
Nota : En Ruby, el equivalente del modificador DOTALL es m
, Regexp::MULTILINE
modificador Regexp::MULTILINE
(por ejemplo, /a.*b/m
).
Nota : JavaScript no proporciona un modificador DOTALL, por lo que a .
nunca se puede permitir que coincida con un carácter de nueva línea. Para lograr el mismo efecto, una solución es necesaria, por ejemplo, sustituyendo todos los .
s con una clase de caracteres comodín como [\S\s]
, o una clase de carácter no nada [^]
(sin embargo, esta construcción será tratada como un error por todos los otros motores, y por lo tanto no es portátil).
Modificador MULTILINE
Otro ejemplo es un modificador MULTILINE (generalmente expresado con el indicador m
(no en Oniguruma (por ejemplo, Ruby) que usa m
para indicar un modificador DOTALL)) que hace que los anclajes de ^
y $
coincidan con el inicio / final de una línea , no el inicio / final de toda la cadena.
/^My Line \d+$/gm
encontrará todas las líneas que comienzan con My Line
, luego contendrá un espacio y 1+ dígitos hasta el final de la línea.
Una versión en línea: (?m)
(por ejemplo, (?m)^My Line \d+$
)
NOTA : En Oniguruma (por ejemplo, en Ruby), y también en casi todos los editores de texto que admiten expresiones regulares, los anclajes ^
y $
indican las posiciones de inicio / final de línea de forma predeterminada . Debe usar \A
para definir todo el comienzo de cadena / documento y \z
para denotar el final de cadena / documento. La diferencia entre \Z
y \z
es que la primera puede coincidir antes del símbolo de nueva línea final (LF) al final de la cadena (por ejemplo, /\Astring\Z/
encontrará una coincidencia en "string\n"
) (excepto Python, donde el comportamiento de \Z
es igual a \z
no se admite el anclaje \z
).
Modificador IGNORE CASE
El modificador común para ignorar el caso es i
:
/fog/i
coincidirá con Fog
, foG
, etc.
La versión en línea del modificador se parece a (?i)
.
Notas:
En Java, de forma predeterminada, la coincidencia que no distingue entre mayúsculas y minúsculas asume que solo se comparan los caracteres en el conjunto de caracteres US-ASCII. La coincidencia no sensible a mayúsculas y minúsculas se puede habilitar especificando el indicador UNICODE_CASE
junto con este CASE_INSENSITIVE
( CASE_INSENSITIVE
) . (por ejemplo, Pattern p = Pattern.compile("YOUR_REGEX", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
). Se puede encontrar algo más sobre esto en Coincidencia insensible a mayúsculas y minúsculas en RegEx de Java . Además, UNICODE_CHARACTER_CLASS
se puede usar para hacer que Unicode concuerde.
VERBOSE / COMMENT / IgnorePatternWhitespace modifier
El modificador que permite usar espacios en blanco dentro de algunas partes del patrón para formatearlo para una mejor legibilidad y para permitir comentarios que comiencen con #
:
/(?x)^ # start of string
(?=\D*\d) # the string should contain at least 1 digit
(?!\d+$) # the string cannot consist of digits only
\# # the string starts with a hash symbol
[a-zA-Z0-9]+ # the string should have 1 or more alphanumeric symbols
$ # end of string
/
Ejemplo de una cadena: #word1here
. Tenga en cuenta que el símbolo #
se escapa para denotar un #
literal que forma parte de un patrón.
El espacio en blanco que no se ha escapado en el patrón de expresión regular se ignora, escápelo para que forme parte del patrón.
Generalmente, el espacio en blanco dentro de las clases de caracteres ( [...]
) se trata como un espacio en blanco literal, excepto en Java.
Además, vale la pena mencionar que en PCRE, .NET, Python, Ruby Oniguruma, ICU, Boost regex, los sabores se pueden usar (?#:...)
dentro del patrón regex.
Modificador explícito de captura
Este es un modificador específico de expresiones regulares de .NET expresado con n
. Cuando se utilizan, los grupos sin nombre (como (\d+)
) no se capturan. Solo las capturas válidas son grupos con nombres explícitos (por ejemplo, (?<name> subexpression)
).
(?n)(\d+)-(\w+)-(?<id>\w+)
coincidirá con todo 123-1_abc-00098
, pero (\d+)
y (\w+)
no crearán grupos en el objeto coincidente resultante. El único grupo será ${id}
. Ver demo .
Modificador UNICODE
El modificador UNICODE, generalmente expresado como u
(PHP, Python) o U
(Java), hace que el motor de expresiones regulares trate el patrón y la cadena de entrada como cadenas y patrones de Unicode, hace que las clases abreviadas del patrón como \w
, \d
, \s
, etc. Unicode-conscientes.
/\A\p{L}+\z/u
es una expresión regular de PHP para hacer coincidir cadenas que constan de 1 o más letras Unicode. Ver la demo regex .
Tenga en cuenta que en PHP , el modificador /u
permite al motor PCRE manejar cadenas como UTF8 (activando el verbo PCRE_UTF8
) y hacer que las clases de caracteres abreviadas en el patrón Unicode sean conscientes (al habilitar el verbo PCRE_UCP
, consulte más en pcre.org ) .
Los patrones y las cadenas de sujetos se tratan como UTF-8. Este modificador está disponible desde PHP 4.1.0 o superior en Unix y desde PHP 4.2.3 en win32. La validez UTF-8 del patrón y del sujeto se verifica desde PHP 4.3.5. Un sujeto no válido hará que la función preg_ * no coincida con nada; un patrón no válido activará un error de nivel E_WARNING. Las secuencias de UTF-8 de cinco y seis octetos se consideran inválidas desde PHP 5.3.4 (resp. PCRE 7.3 2007-08-28); anteriormente aquellos han sido considerados como válidos UTF-8.
En Python 2.x, re.UNICODE
solo afecta al patrón: Make \w
, \W
, \b
, \B
, \d
, \D
, \s
y \S
dependientes de la base de datos de propiedades de caracteres Unicode.
Una versión en línea: (?u)
en Python, (?U)
en Java. Por ejemplo:
print(re.findall(ur"(?u)\w+", u"Dąb")) # [u'D\u0105b']
print(re.findall(r"\w+", u"Dąb")) # [u'D', u'b']
System.out.println("Dąb".matches("(?U)\\w+")); // true
System.out.println("Dąb".matches("\\w+")); // false
PCRE_DOLLAR_ENDONLY modificador
El modificador PCRE_DOLLAR_ENDONLY compatible con PCRE que hace que el ancla $
coincida al final de la cadena (excluyendo la posición antes de la nueva línea final en la cadena).
/^\d+$/D
es igual a
/^\d+\z/
y coincide con una cadena completa que consta de 1 o más dígitos y no coincidirá con "123\n"
, pero coincidirá con "123"
.
Modificador PCRE_ANCHORED
Otro modificador compatible con PCRE expresado con /A
modificador. Si se establece este modificador, el patrón se obliga a "anclarse", es decir, se limita a coincidir solo al comienzo de la cadena que se está buscando (la "cadena de asunto"). Este efecto también puede lograrse mediante construcciones apropiadas en el propio patrón, que es la única forma de hacerlo en Perl.
/man/A
es lo mismo que
/^man/
Modificador PCRE_UNGREEDY
El indicador PCRE_UNGREEDY compatible con PCRE expresado con /U
Cambia la codicia dentro de un patrón: /a.*?b/U
= /a.*b/
y viceversa.
Modificador PCRE_INFO_JCHANGED
Un modificador PCRE más que permite el uso de grupos nombrados duplicados.
NOTA : solo se admite la versión en línea - (?J)
, y se debe colocar al inicio del patrón.
Si utiliza
/(?J)\w+-(?:new-(?<val>\w+)|\d+-empty-(?<val>[^-]+)-collection)/
los valores de grupo "val" nunca estarán vacíos (siempre se establecerán). Sin embargo, se puede lograr un efecto similar con el reinicio de rama.
Modificador PCRE_EXTRA
Un modificador de PCRE que causa un error si una barra invertida en un patrón es seguida por una letra que no tiene un significado especial. De forma predeterminada, una barra invertida seguida de una letra sin un significado especial se trata como un literal.
P.ej
/big\y/
coincidirá bigy
, pero
/big\y/X
lanzará una excepción.
Versión en línea: (?X)