Skip to content

Latest commit

 

History

History
501 lines (313 loc) · 35.1 KB

perlrebackslash.pod

File metadata and controls

501 lines (313 loc) · 35.1 KB

NAME

perlrebackslash - Secuencias de escape en expresiones regulares en Perl

DESCRIPCIÓN

La documentación de alto nivel acerca de expresiones regulares de Perl se encuentra en perlre.

Este documento describe todas las secuencias de escape y de diagonales inversa. Después de explicar el rol de la barra diagonal invertida, se lista todas las secuencias que tengan un significado especial en las expresiones regulares Perl (en orden alfabética), y luego describe cada una de ellas.

La mayor parte de las secuencias se describen en detalle en diferentes documentos; el principal propósito de este documento es tener una guía rápida que describa todas las secuencias de escape y de diagonal inversa.

La barra diagonal inversa

En una expresión regular, la barra diagonal inversa puede realizar una de dos posibles tareas: puede desactivar el significado especial del carácter que le sigue (por ejemplo, \| coincide con una barra vertical, no una alternancia), o es el inicio de una secuencia de escape o de diagonal inversa.

Las reglas que lo determinan son muy simples: si el carácter que le sigue a la barra diagonal inversa es un carácter ASCII de puntuación (no de palabra) (es decir, cualquier cosa que no sea una letra, dígito o guión bajo), entonces la barra diagonal inversa desactiva cualquier significado especial del carácter que le sigue.

Si el carácter que sigue a la barra diagonal es una letra ASCII o un dígito ASCII, entonces la secuencia puede ser especial; si lo es, se lista más abajo. No se usan unas pocas letras, así que escaparlas con una barra diagonal inversa no las hace especiales. Una futura versión de Perl puede asignarles un significado especial, así que si tiene las advertencias activadas, Perl emite un aviso si usa tal secuencia. [1].

Sin embargo, se garantiza que las secuencias de escape o de diagonal inversa nunca tendrán un carácter de puntuación siguiente a una barra diagonal inversa, ni ahora, ni en una futura versión de Perl 5. Así que es seguro poner una barra diagonal inversa delante de un carácter que no forme parte de una palabra.

Note que la propia barra diagonal inversa es en sí misma especial; si quiere puede escapar la barra diagonal inversa con una barra diagonal inversa: /\\/ coincide con una única barra diagonal inversa.

[1]

Hay una excepción. Si usa un carácter alfanumérico como delimitador de su patrón (que probablemente no debería hacer, por cuestiones de legibilidad), tendrá que escapar el delimitador si quiere buscarlo, con el patrón. En este caso, Perl no lo advertirá. Vea también "Detalles sangrientos de las construcciones de interpretación entrecomilladas" in perlop.

Todas secuencias y escapes

Las que no se pueden usar dentro de una clase de caracteres entre corchetes (como [\da-z]) se marcan como No en []..

\000              Secuencia de escape octal.  Ver también \o{}.
\1                Retrorreferencia absoluta.  No en [].
\a                Alarma o campana.
\A                Comienzo de cadena.  No en [].
\b{}, \b          Límite. (\b es un retroceso en []).
\B{}, \B          No un límite.  No en [].
\cX               Control-X.
\d                Clase carácter para dígitos.
\D                Clase carácter para no-dígitos.
\e                Carácter de escape.
\E                Desactivar procesamiento \Q, \L y \U.  No en [].
\f                Avanza de página.
\F                Cambio de tamaño de caja, hasta \E.  No en [].
\g{}, \g1         Retrorreferencia con nombre, absoluta o relativa.
                  No en [].
\G                Aserción de posición.  No en [].
\h                Clase carácter para espacio en blanco horizontal.
\H                Clase carácter para no-espacio en blanco horizontal.
\k{}, \k<>, \k''  Retrorreferencia con nombre.  No en [].
\K                Mantener el material que está a la izquierda de \K.  No en [].
\l                Poner en minúscula el siguiente carácter.  No en [].
\L                Poner en minúscula hasta \E.  No en [].
\n                Carácter (lógico) de nueva línea.
\N                Cualquier carácter excepto los de nueva línea.  No en [].
\N{}              Carácter o secuencia (Unicode) con nombre o número.
\o{}              Secuencia de escape octal.
\p{}, \pP         Carácter con la propiedad Unicode indicada.
\p{}, \pP         Carácter sin la propiedad Unicode indicada.
\Q                Entrecomilla (desactiva) los metacaracteres de patrón hasta \E  No
                  en [].
\r                Carácter de retorno.
\R                Nueva línea genérica.  No en [].
\s                Clase carácter para espacio en blanco.
\S                Clase carácter para espacio no-blanco.
\t                Carácter tabulador.
\u                Capitaliza el siguiente carácter.  No en [].
\U                Pasar a mayúscula hasta \E.  No en [].
\v                Clase carácter para espacio en blanco vertical.
\V                Clase carácter para no-espacio en blanco vertical.
\w                Clase carácter para caracteres de palabra.
\W                Clase carácter para no-caracteres de palabra.
\x{}, \x00        Secuencia de escape hexadecimal.
\X                "Agrupación Unicode extendida de grafemas ".  No en [].
\z                Fin de cadena.  No en [].
\Z                Fin de cadena.  No en [].

Carácter de escape

Caracteres fijos

Un puñado de caracteres tienen un carácter de escape dedicado. Aparecen en la siguiente tabla, junto con sus códigos de carácter ASCII (en decimal y hex), su nombre ASCII, el control de escape en plataformas ASCII y una breve descripción. (Para plataformas EBCDIC, vea "OPERATOR DIFFERENCES" in perlebcdic).

Sec.  Cod. Car.  ASCII   Contr.  Descripción.
      Dec    Hex
 \a     7     07    BEL    \cG    alarma o campana
 \b     8     08     BS    \cH    retroceso [1]
 \e    27     1B    ESC    \c[    carácter de escape
 \f    12     0C     FF    \cL    avance de página
 \n    10     0A     LF    \cJ    avance de línea [2]
 \r    13     0D     CR    \cM    retorno de carro
 \t     9     09    TAB    \cI    tabulador
[1]

\b es el carácter de retroceso solo dentro de una clase carácter. Fuera de una clase carácter, un solitario \b es un límite de palabra/no-palabra, y \b{} es algún otro tipo de límite.

[2]

\n coincide con un avance de línea lógico. Perl convierte entre \n y el carácter de nueva línea nativo de su sistema operativo cuando se lea o escriba a archivos de texto.

Ejemplo

$str =~ /\t/;   # Coincide si $str contiene un tabulador (horizontal).

Caracteres de control

Se usa \c para denotar a un carácter de control; el carácter siguiente \c determina el valor de la construcción. Por ejemplo, el valor de \cA es chr(1), y el valor de \cb es chr(2), etc. Los detalles sangrientos están en "Operadores regex entrecomillados" in perlop. Una lista completa de lo que chr(1), etc. significan para plataformas ASCII y EBCDIC está en "DIFERENCIAS de OPERADORES" in perlebcdic.

Note que no es válido un solo \c\ al final de la expresión regular (o cadena doblemente entrecomillada). La barra diagonal inversa debe estar seguida por otro carácter. Es decir, \c\X es igual a chr(28) . 'X' para todos los caracteres X.

Para escribir código independiente de la plataforma, debe usar en su lugar \N{NOMBRE}, como \N{ESCAPE} o \N{U+001B}; vea charnames.

Mnemónico: carácter de control.

Ejemplo

$str =~ /\cK/;  # Coincide si $str contiene un tabulador vertical (control-K).

Caracteres y secuencias de carácter con nombre o número

Los caracteres Unicode tienen un nombre Unicode y un valor numérico (ordinal) de código de carácter. Use la construcción \N{} para especificar un carácter por cualquiera de estos valores. Ciertas secuencias de caracteres tienen también nombres.

Para especificar por nombre, el nombre del carácter o secuencia de caracteres va entre llaves.

Para especificar un carácter por código carácter Unicode, use la forma \N{U+código de carácter}, donde código de carácter es un número en hexadecimal que indica el código de carácter que Unicode ha asignado al carácter deseado. Es costumbre, pero no necesario, usar ceros al principio para rellenar el número a cuatro dígitos. Así \N{U+0041} significa LATIN CAPITAL LETTER A, y raramente lo verá escrito sin los dos ceros de relleno. \N{U+0041} significa "A" incluso en máquinas EBCDIC (donde el valor ordinal "A" no es 0x41).

Es incluso posible indicar sus propios nombres a caracteres y secuencias de carácter. Para más detalles, vea charnames.

(Existe una forma interna expandida que puede ver en la salida de depuración: \N{U+código de carácter.código de carácter...}. El ... significa cualquier número de códigos de carácter separados por puntos. Representa la secuencia formada por los caracteres. Esto solo es una forma interna, sujeto a cambio, y no debería intentarlo por sí mismo).

Mnemónico: Carácter con Nombre.

Note que un carácter o secuencia de carácter expresados como un carácter con nombre o con número se considera que es un carácter sin significado especial para el motor de exp. reg., y coincidirá "tal cual".

Ejemplo

$str =~ /\N{THAI CHARACTER SO SO}/;  # Coincide con el carácter Thai SO SO

use charnames 'Cyrillic';            # Carga los nombres del Cirílico.
$str =~ /\N{ZHE}\N{KA}/;             # Coincide con "ZHE" seguido por "KA".

Escapes octales

Existen dos formas de escapes octales. Se usa cada una de ellas para especificar un carácter por su código de carácter especificado en notación octal.

Una forma, disponible a partir de Perl v5.14 es como \o{...}, donde los puntos representan uno o más dígitos octales. Se puede usar para cualquier carácter Unicode.

Se introdujo para evitar los problemas potenciales con la otra forma, disponible en todos los Perl. Esa forma consiste de una barra diagonal inversa seguida por tres dígitos octales. Un problema con esta forma es que se parece exactamente como una retrorreferencia normal (vea "Reglas de desambiguación entre las secuencias de escape octales y las retrorreferencias" más abajo). Puede evitarlo puede hacer que el primero de los tres dígitos siempre sea cero, pero eso hace que sea \077 el mayor código de carácter que puede especificar.

En algunos contextos, una barra diagonal inversa seguida por dos o incluso un dígito octal se puede interpretar como una secuencia de escape octal, algunas veces con una advertencia, y debido a algunos errores, otras veces con resultados sorprendentes. También, si está creando una exp. reg. a partir de pequeños códigos sueltos, concatenados, y si están usando menos de tres dígitos, el comienzo de un código se puede interpretar como que está añadiendo dígitos al final del código que le precede. Vea "Referencia absoluta" para una mayor discusión y ejemplos del problema de los códigos pequeños.

Note que un carácter expresado como un escape octal se considera como un carácter sin significado especial por el motor de exp. reg., y coincidirá "tal cual".

Para resumir, siempre es seguro usar la forma \o{}, y la otra forma es segura usarla para códigos de carácter hasta \077 cuando use exactamente tres dígitos para especificarlos.

Mnemónico: 0ctal u octal.

Ejemplos (asumimos una plataforma ASCII)

$str = "Perl";
$str =~ /\o{120}/;  # Coincide, "\120" es "P".
$str =~ /\120/;     # Lo mismo.
$str =~ /\o{120}+/; # Coincide, "\120" es "P",
                    # se repite al menos una vez.
$str =~ /\120+/;    # Lo mismo.
$str =~ /P\053/;    # No coincide, "\053" es "+" y tomado literalmente.
/\o{23073}/         # carita sonriente, negro sobre blanco.
/\o{4801234567}/    # Lanza una advertencia, y genera un chr(4).

Reglas de desambiguación entre las secuencias de escape octales y las retrorreferencias

Los escapes octales de la forma \000, fuera de las clases de caracteres entre corchetes, pueden, potencialmente, colisionar con las retrorreferencias escritas al viejo estilo (vea "Referencia absoluta" más abajo). Los dos consisten en una barra diagonal inversa seguida por números. Así que Perl tiene que usar heurística para determinar si es una retrorreferencia o un escape octal. Perl usa las siguientes reglas para hacer la desambiguación:

  1. Si la barra diagonal inversa es seguida por un único dígito, es una retrorreferencia.

  2. Si el primer dígito que sigue a la barra diagonal inversa es un 0, es un escape octal.

  3. Si el número que sigue a la barra diagonal inversa es N (en decimal), y Perl ha visto realmente N grupos de captura, Perl considera que es una retrorreferencia. De lo contrario, se considera que es un escape octal. Si N tiene más de tres dígitos, Perl toma solo los tres primeros para el escape octal; el resto se toma para coincidir tal cual.

    my $pat  = "(" x 999;
       $pat .= "a";
       $pat .= ")" x 999;
    /^($pat)\1000$/;   #  Coincide con 'aa'; hay 1000 grupos de captura.
    /^$pat\1000$/;     #  Coincide con 'a@0'; hay 999 grupos de captura
                       #  y \1000 es visto como \100 (una '@') y un '0'.

Siempre puede forzar a que se interprete como una retrorreferencia usando la forma \g{...}. Siempre puede forzar a que se interprete como octal usando la forma \o{...}, o para los números hasta \077 (= 63 decimal), usando tres dígitos comenzando por "0".

Escapes hexadecimales

Al igual que los escapes octales, existen dos formas de escapes hexadecimales, pero ambas empiezan con la misma secuencia: \x. A esto le sigue, exactamente, dos dígitos hexadecimales formando un número, o un número hexadecimal de longitud arbitraria rodeado con llaves. El número hexadecimal es el código del carácter que quiere expresar.

Note que un carácter expresado como uno de estos escapes se considera como un carácter sin significado especial por el motor de exp. reg., y coincidirá "tal cual".

Mnemónico: hexadecimal.

Ejemplos (asumimos una plataforma ASCII)

$str = "Perl";
$str =~ /\x50/;    # Coincide, "\x50" es "P".
$str =~ /\x50+/;   # Coincide, "\x50" es "P", y se repite al menos una vez
$str =~ /P\x2B/;   # No coincide, "\x2B" es "+" y toma literalmente.

/\x{2603}\x{2602}/ # Hombre de nieve con paraguas.
                   # El carácter Unicode 2603 es un hombre de nieve,
                   # el carácter Unicode 2602 es un paraguas.
/\x{263B}/         # Carita sonriente, en negro.
/\x{263b}/         # Lo mismo, los dígitos hex. A - F son independientes del tamaño de caja.

Modificadores

Un cierto número de secuencias con barras diagonales inversas cambian el carácter o caracteres que les sigan. \l pasará a minúsculas el carácter que le sigue, mientras que \u lo pasará a mayúsculas (o, más precisamente, capitalizar) el carácter que le sigue. Ofrecen una funcionalidad similar a las funciones lcfirst y ucfirst.

Para pasar a mayúsculas o minúsculas un conjunto de caracteres, uno podría querer usar \L o \U, que pasarán a minúsculas/mayúsculas todos los caracteres que les siguen, hasta el final del patrón o la siguiente ocurrencia de \E, lo que ocurra primero. Ofrecen una funcionalidad similar a lo que ofrecen las funciones lc y uc.

\Q se usa para entrecomillar (desactivar) un patrón de metacaracteres, hasta el siguiente \E o el final del patrón. \Q añade una barra diagonal inversa a cualquier carácter que tuviera un significado especial a Perl. En el rango ASCII, escapa todos los caracteres que no sean una letra, un dígito o un guión bajo. Vea "quotemeta" in perlfunc para más detalles de lo que queda escapado para códigos de carácter no ASCII. Usar esto asegura que cualquier carácter entre \Q y \E coincidirá literalmente, no interpretado literalmente como metacarácter, por el motor de exp. reg.

\F se puede usar para cambiar el tamaño de caja de todos los caracteres que le siguen, hasta el siguiente \E o el final del patrón. Ofrece una funcionalidad similar a la función fc.

Mnemónico: MinúscuLas, MayúscUlas, Fold (plegar), Quotemeta, TErminar.

Ejemplos

$sid     = "sid";
$greg    = "GrEg";
$miranda = "(Miranda)";
$str     =~ /\u$sid/;        # Coincide con 'Sid'
$str     =~ /\L$greg/;       # Coincide con 'greg'
$str     =~ /\Q$miranda\E/;  # Coincide con '(Miranda)', como si el patrón
                             #   se hubiera escrito como /\(Miranda\)/

Clases de caracteres

Las expresiones regulares Perl tienen un amplio rango de clases de caracteres. Algunas de las clases de caracteres se escriben como una secuencia de barra diagonal inversa. Discutiremos brevemente algunas de ellas; todos los detalles sobre las clases de caracteres se pueden encontrar en perlrecharclass.

\w es una clase de caracteres que coincide con cualquier carácter que forme parte de una palabra (letras, dígitos, marcas Unicode, caracteres de puntuación de unión (como el guión bajo)). \d es una clase de caracteres que coincide con cualquier dígito decimal, mientras que la clase de caracteres \s coincide con cualquier carácter espacio en blanco. Nuevo en perl 5.10.0 son las clases \h y \v que coinciden con los caracteres de espacio en blanco horizontal y vertical.

El conjunto exacto de caracteres que coinciden con \d, \s y \w varía dependiendo de varios pragma y modificadores de expresiones regulares. Es posible restringir la coincidencia al rango ASCII usando el modificador de expresiones regulares /a. Vea perlrecharclass.

Las variantes en mayúsculas (\W, \D, \S, \H y \V) son clases de caracteres que coinciden, respectivamente, con cualquier carácter que no forme parte de una palabra, un dígito, espacio en blanco, espacio en blanco horizontal o espacio en blanco vertical.

Mnemónicos: word (palabra), dígito, espacio, horizontal, vertical.

Clases Unicode

\pP (donde P es una sola letra) y \p{Propiedad} se usan para coincidir con un carácter que coincida con la propiedad Unicode indicada; las propiedades incluyen cosas como "letra" o "carácter thai". La capitalización de la secuencia a \PP y \P{Propiedad} hace que la secuencia coincida con un carácter que no coincida con la propiedad Unicode indicada. Para más detalles, vea "Secuencias de barras diagonales inversas" in perlrecharclass y "Propiedades de carácter Unicode" in perlunicode.

Mnemónico: propiedad.

Referencia

Si se usan paréntesis de captura en una expresión regular, podemos referirnos a la parte de la cadena fuente con la que se hace la operación de coincidencia, y coincide exactamente con el patrón. Hay tres formas de referirnos a tal retrorreferencia: absoluta, relativa, y por nombre.

Referencia absoluta

Tanto \gN (a partir de Perl 5.10.0), o \N (al viejo estilo) donde N es un número decimal positivo (sin signo) de cualquier longitud es una referencia absoluta a un grupo de captura.

N refiere al N-esimo conjunto de paréntesis, así que \gN refiere a lo que coincidió con ese conjunto de paréntesis. Así, \g1 refiere al primer grupo de captura en la exp. reg.

La forma \gN se puede escribir como \g{N} que evita la ambigüedad cuando se genera una exp. reg. concatenando otras cadenas más cortas. De otra forma, si tiene una exp. reg. qr/$a$b/, y $a contiene "\g1" y $b contiene "37", obtendrá \g137/ que, probablemente, no sea lo que pretendía.

En la forma \N, N no debe comenzar con un "0", y deben existir al menos N grupos de captura, o si no se considera que N es un escape octal (pero algo como \18 es lo mismo que \0018; es decir, el escape octal "\001" seguido por el dígito literal "8").

Mnemónico: grupo.

Ejemplos

/(\w+) \g1/;    # Encuentra una palabra duplicada, (ej. "gato gato").
/(\w+) \1/;     # Lo mismo; escrito al viejo estilo.
/(.)(.)\g2\g1/;  # Coincide con un palíndromo de cuatro letras (ej. "ABBA").

Referencia relativa

\g-N (a partir de Perl 5.10.0) se usa para direccionamiento relativo. (Se puede escribir como \g{-N). Refiere al N-ésimo grupo antes de \g{-N}.

La gran ventaja de hacerlo de esta forma es que hace mucho más fácil escribir patrones con referencias que pueden interpolarse en patrones más grandes, incluso si el patrón más grande también contiene grupos de captura.

Ejemplos

/(A)        # Grupo 1
 (          # Grupo 2
   (B)      # Grupo 3
   \g{-1}   # Refiere al grupo 3 (B)
   \g{-3}   # Refiere a grupo 1 (A)
 )
/x;         # Coincide con "ABBA".

my $qr = qr /(.)(.)\g{-2}\g{-1}/;  # Coincide con 'abab', 'cdcd', etc.
/$qr$qr/                           # Coincide con 'ababcdcd'.

Referencias con nombre

\g{nombre} (a partir de Perl 5.10.0) se puede usar para referirse a un grupo de captura anterior, con un nombre, liberándonos completamente de tener que pensar en posiciones de los búferes de captura.

Para ser compatible con las expresiones regulares en .Net, \g{nombre} también se puede escribir como \k{nombre}, \k<nombre> o \k'nombre'.

Para evitar cualquier tipo de ambigüedad, nombre no debe empezar con un dígito ni contener un guión.

Ejemplos

/(?<palabra>\w+) \g{palabra}/ # Encuentra palabras duplicadas, (p. ej. "gato gato")
/(?<palabra>\w+) \k{palabra}/ # Lo mismo.
/(?<palabra>\w+) \k<palabra>/ # Lo mismo.
/(?<letra1>.)(?<letra2>.)\g{letra2}\g{letra1}/
                        # Coincide con un palíndromo de cuatro letras (ej. "ABBA").

Aserciones

Las aserciones son condiciones que tienen que ser ciertas; actualmente no coinciden con partes de la subcadena. Existen seis aserciones que se escriben como secuencias con barras diagonales inversas.

\A

\A solo coincide con el comienzo de la cadena. Si no se usa el modificador /m, entonces /\A/ es equivalente a /^/. Sin embargo, si se usa el modificar /m, entonces /^/ coincide con los caracteres internos de nueva línea, pero el significado de /\A/ no cambia por usar ese modificador. \A coincide con el comienzo de la cadena sin importar si se usa o no el modificador /m.

\z, \Z

\z y \Z coinciden con el final de la cadena. Si no se usa el modificador /m, entonces /\Z/ es equivalente a /$/; es decir, coincide con el final de la cadena, o uno antes del carácter de nueva línea al final de la cadena. Si se usa el modificar /m, entonces /$/ coincide con los caracteres internos de nueva línea, pero el significado de /\Z/ no cambia por usar ese modificador. \Z coincide con el final de la cadena (o justo antes del nueva línea final) sin importar si se usa el modificador /m.

\z es igual que \Z, excepto que no coincide antes de un carácter de nueva línea final. \z solo coincide con el final de la cadena, sin importar los modificadores que se estén usando, y no justo antes de un carácter de nueva línea. Así es cómo anclar la coincidencia al verdadero final de la cadena, bajo cualquier circunstancia.

\G

\G normalmente solo se usa en combinación con el modificador /g. Si se usa el modificador /g y la coincidencia es en contexto escalar, Perl recuerda dónde acabó la última coincidencia en la cadena fuente, y en la próxima ocasión, iniciará la coincidencia desde donde acabó la vez anterior.

\G coincide con el punto donde terminó la coincidencia anterior, en esa cadena, o el comienzo de la cadena si no hubo coincidencia previa.

Mnemónico: Global.

\b{}, \b, \B{}, \B

\b{...}, disponible a partir de v5.22, coincide con un límite (entre dos caracteres o antes del primer carácter de la cadena, o después del último carácter de la cadena) basado en las reglas Unicode para el tipo de límite especificado dentro de las llaves. Los tipos de límite conocidos en la actualidad, se indican en los párrafos siguientes. \B{...} coincide con cualquier lugar entre caracteres donde \b{...}, del mismo tipo, no coincide.

\b, cuando no se sigue inmediatamente por un "{", coincide con el lugar entre un carácter de palabra (algo que coincida con \w) y un carácter de no-palabra (\W); \B, cuando no se sigue inmediatamente por un "{" coincide con el lugar entre caracteres donde \b no coincide. Para obtener una mejor coincidencia de palabra en lenguaje de texto natural, vea "\b{wb}" más abajo.

\b y \B asumen que hay un carácter de no palabra antes del comienzo y final de la cadena fuente; así \b coincidirá con el comienzo (o final) de la cadena fuente si la cadena comienza (o termina) con un carácter de palabra. De lo contrario, coincidirá \B.

No use algo como \b=head\d\b y expere que coincida con el comienzo de la línea. No lo hará, porque hay una frontera antes del carácter de no palabra "="; debe haber un carácter de palabra inmediatamente antes. Todas las determinaciones simples de límite, \b y \B, buscan por caracteres de palabra sueltos, no por caracteres de no palabra, ni por finales de cadena. Puede ayudar a entender cómo funcionan \b y \B equiparándolos a lo que sigue:

\b      significa realmente     (?:(?<=\w)(?!\w)|(?<!\w)(?=\w))
\B      significa realmente     (?:(?<=\w)(?=\w)|(?<!\w)(?!\w))

En contraste, \b{...} y \B{...} pueden o no coincidir con el comienzo y el final de la línea, dependiendo del tipo de límite. Estas implementan los límites por defecto de Unicode, especificados en http://www.unicode.org/reports/tr14/ y http://www.unicode.org/reports/tr29/. Los tipos de límite son:

\b{gcb} o \b{g}

Coincide con un "Grapheme Cluster Boundary" (Límite de agrupación de grafemas) de Unicode. (Actualmente, Perl siempre usa el mejorado "'extended' grapheme cluster" -agrupación de grafemas extendido-). Se explican más abajo, en "\X". De hecho, \X es otra forma de obtener la misma funcionalidad. Es equivalente a /.+?\b{gcb}/. Use el que sea más conveniente para su situación.

\b{lb}

Esto coincide de acuerdo a lo que indica el valor por defecto de Unicode Line Breaking Algorithm (http://www.unicode.org/reports/tr14/), tal y como está personalizado en ese documento (Example 7 of revision 35) para un mejor manejo de las expresiones numéricas.

Esto sirve para varios propósitos, pero el módulo Unicode::LineBreak está disponible en CPAN, que ofrece muchas más características, incluyendo la personalización.

\b{sb}

Coincide con un "Sentence Boundary" (Límite de frase) de Unicode. Esto es una ayuda para interpretar frases en lenguaje natural. Da buenos resultados, pero imperfectos. Por ejemplo, cree que "Sr. Pérez" son dos frases. Hay más detalles en http://www.unicode.org/reports/tr29/. Note también que él cree que cualquier coincidencia con "\R" (excepto con el avance de página y el tabulador vertical) es un límite de frase. \b{sb} funciona con texto diseñado para procesadores de texto que desplazan líneas de forma automática, al mostrarlas, pero los límites incluidos en el propio texto se considerarán esencialmente como los finales de los bloques de texto (párrafos, realmente), y de ahí, los finales de frase. \b{sb} no lo hace bien con texto que contenga caracteres de nueva línea integrados, como el texto del documento que está leyendo ahora. Tales textos necesitan ser preprocesados para quitar los separadores de línea antes de buscar por límites de frase. Algunas personas ven esto como un error en el estándar Unicode, y este comportamiento es muy probable que sea objeto de cambio en futuras versiones de Perl.

\b{wb}

Coincide con un "Word Boundary" (Límite de palabra) de Unicode, pero ajustado a las expectativas de Perl. Ofrece un mejor resultado (aunque no perfecto) para el procesado de lenguaje natural que el simple \b (sin llaves). Por ejemplo, entiende que los apóstrofes pueden estar en medio de palabras y que los paréntesis, no (vea los ejemplos de más abajo). Hay más detalles en http://www.unicode.org/reports/tr29/.

La definición actual de Unicode de un límite de palabra coincide entre todos los caracteres de espacio en blanco. Perl ajusta esto, comenzando en la versión 5.24, para, de forma general, no romper conjuntos de espacios en blanco, tal y como siempre funcionaba un sencillo \b. Esto permite que \b{wb} sea un reemplazo de \b, pero, generalmente, con mejores resultados para el procesado de lenguaje natural. (La excepción a este ajuste es cuando a un conjunto de espacios en blanco se le sigue algo como U+0303, COMBINING TILDE. Si el carácter espacio final en el conjunto, es un espacio en blanco horizontal, lo rompe, para de esta manera unirse en lugar de combinar un carácter. Para ser preciso, si un conjunto de espacio en blanco que acaba en un espacio horizontal, se le sigue inmediatamente un carácter, que tenga tanto los valores de propiedad de límite "Extendido" (Extend) o "Formato" (Format), el límite entre el carácter de espacio horizontal y el resto del conjunto coincide con \b{wb}. En todos los otros casos, el límite entre dos caracteres espacios en blanco coincide con \B{wb}).

Es importante darse cuenta cuando use estos límites Unicode, que se está arriesgando a que en una futura versión de Perl, que contenga la última versión del Estándar Unicode no funcione de la misma manera que cuando el código fue escrito. Estas reglas no se consideran estables y han estado sujetas a más cambios que el resto del Estándar. Unicode se reserva el derecho de cambiarlas, y Perl se reserva el derecho de actualizar su implementación para las nuevas reglas Unicode. En el pasado, se produjeron algunos cambios porque se añadieron nuevos caracteres al Estándar, que tienen características muy diferentes de todos los anteriores caracteres, así que se formularon nuevas reglas para gestionarlos. No deberían causar ningún problema de compatibilidad. Pero algunos de ellos han cambiado el tratamiento de los caracteres existentes porque el Unicode Technical Committee (Comité técnico Unicode) decidió que el cambio está garantizado por una razón. Esto podría ser el arreglo de un error, o porque creen que se obtienen mejores resultados con la nueva regla.

También es importante darse cuenta que estas son las definiciones por defecto de límite, y esas implementaciones pueden desear ajustar los resultados para propósitos y configuraciones regionales particulares. Por ejemplo, algunos idiomas, como el Japonés y el Thai, requiere consultar el diccionario para determinar el límite de las palabras.

Mnemónico: borde.

Ejemplos

"gato"   =~ /\Agato/;     # Coincide.
"gato"   =~ /gato\Z/;     # Coincide.
"gato\n" =~ /gato\Z/;     # Coincide.
"gato\n" =~ /gato\z/;     # No coincide.

"gato"   =~ /\bgato\b/;   # Coincide.
"gatos"  =~ /\bgato\b/;   # No coincide.
"gato"   =~ /\bgato\B/;   # No coincide.
"gatos"  =~ /\bgato\B/;   # Coincide.

while ("gato perro" =~ /(\w+)/g) {
    print $1;           # Imprime 'gatoperro'
}
while ("gato perro" =~ /\G(\w+)/g) {
    print $1;           # Imprime 'gato'
}

my $s = "He said, \"Is pi 3.14? (I'm not sure).\"";
print join("|", $s =~ m/ ( .+? \b     ) /xg), "\n";
print join("|", $s =~ m/ ( .+? \b{wb} ) /xg), "\n";
 imprime
He| |said|, "|Is| |pi| |3|.|14|? (|I|'|m| |not| |sure
He| |said|,| |"|Is| |pi| |3.14|?| |(|I'm| |not| |sure|)|.|"

Miscelánea

Aquí documentamos las secuencias de barra diagonal inversas que no caen en ninguna de las categorías anteriores. Son los siguientes:

\K

Apareció en perl 5.10.0. Cualquier cosa que coincida en la parte izquierda de \K no se incluye en $&, y no se reemplazará si el patrón se está usando en una sustitución. Esto le permite escribir s/PAT1 \K PAT2/REPL/x en lugar de s/(PAT1) PAT2/${1}REPL/x o s/(?<=PAT1) PAT2/REPL/x.

Mnemónico: Keep (mantener).

\N

Esta característica, disponible a partir de v5.12, coincide con cualquier carácter que no sea un carácter de nueva línea. Es una forma de escribir [^\n], y es idéntica al metasímbolo ., excepto bajo el indicador /s, que cambia el significado de ., pero no de \N.

Note que \N{...} puede significar carácter con número o nombre.

Mnemónico: Complemento de \n.

\R

\R coincide con un nueva línea genérico; es decir, cualquier cosa que Unicode considere que es una secuencia de ruptura de línea. Esto incluye a todos los caracteres que coinciden con \v (espacio en blanco vertical), y la secuencia multicarácter "\x0D\x0A" (retorno de carro seguido por un avance de línea, algunas veces llamado el nueva línea de red; es la secuencia de fin de línea utilizada en los archivos de texto de Microsoft abiertos en modo binario). \R es equivalente a (?>\x0D\x0A|\v). (La razón de no usar la vuelta atrás es que la secuencia se considera inseparable. Eso significa que

"\x0D\x0A" =~ /^\R\x0A$/   # No coincide

falla, porque \R coincide con la cadena entera, y no hará una vuelta atrás para coincidir solo con "\x0D"). Ya que \R puede coincidir con una secuencia de más de un carácter, no se puede poner dentro de una clase de caracteres entre corchetes; /[\R]/ es un error; use en su lugar \v. \R fue presentado en perl 5.10.0.

Note que no respeta ninguna configuración regional que pudiera estar en efecto; coincide de acuerdo al conjunto de caracteres nativo de la plataforma.

Mnemónico: ninguno actualmente. \R fue elegido porque PCRE ya usa \R, y lo más importante: porque Unicode recomienda ese metacarácter de expresión regular, y sugiere \R como su notación.

\X

Esto coincide con una agrupación de grafemas extendido Unicode.

\X coincide muy bien con el uso normal (que un programador que no usa Unicode) consideraría como un único carácter. Como ejemplo, considere una G con alguna especie de marca diacrítica, como una flecha. No existe tal carácter en Unicode, pero podemos componerlo usando una G seguido por el Unicode "COMBINING UPWARDS ARROW BELOW", y podría mostrarse por algún software compatible con Unicode como un único carácter.

La coincidencia es avariciosa, y sin vuelta atrás, así que la agrupación nunca se rompe en componentes más pequeños.

Vea también \b{gcb}.

Mnemónico: carácter Unicode eXtendido.

Ejemplos

$str =~ s/foo\Kbar/baz/g; # Cambia cualquier 'bar' que siga a un 'foo', a un 'baz'
$str =~ s/(.)\K\g1//g;    # Borra caracteres duplicados.

"\n"   =~ /^\R$/;         # Coincide, \n es un nueva línea genérico.
"\r"   =~ /^\R$/;         # Coincide, \r es un nueva línea genérico.
"\r\n" =~ /^\R$/;         # Coincide, \r\n es un nueva línea genérico.

"P\x{307}" =~ /^\X$/     # \X coincide con una P con un punto arriba.

POD ERRORS

Hey! The above document had some coding errors, which are explained below:

Around line 5:

Non-ASCII character seen before =encoding in 'DESCRIPCIÓN'. Assuming UTF-8