Patrón (Java Platform SE 7)

Una representación compilada de una expresión regular.

Una expresión regular, especificada como una cadena, primero debe compilarse en una instancia de esta clase. El patrón resultante se puede usar para crear un objeto Matcher que puede coincidir con secuencias de caracteres contra la expresión regular. Todo el estado involucrado en la realización de una coincidencia reside en el comparador, por lo que muchos comparadores pueden compartir el mismo patrón.

Por tanto, una secuencia de invocación típica es

 Pattern p = Pattern.
("a*b"); Matcher m = p.
("aaaaab"); boolean b = m.
();

Esta clase define un método matches como una conveniencia para cuando una expresión regular se usa solo una vez. Este método compila una expresión y compara una secuencia de entrada con ella en una sola invocación. La declaración

 boolean b = Pattern.matches("a*b", "aaaaab");

es equivalente a las tres declaraciones anteriores, aunque para coincidencias repetidas es menos eficiente ya que no permite reutilizar el patrón compilado.

Las instancias de esta clase son inmutables y seguras para su uso por varios subprocesos simultáneos. Las instancias de la clase Matcher no son seguras para tal uso.

Resumen de construcciones de expresiones regulares

Barra invertida, escapes y comillas

El carácter de barra invertida («\») sirve para introducir construcciones de escape, como se define en la tabla anterior, así como para citar caracteres que de otro modo se interpretarían como construcciones sin escape. Por tanto, la expresión \\ coincide con una sola barra invertida y \ {coincide con una llave izquierda.

Es un error utilizar una barra invertida antes de cualquier carácter alfabético que no denote una construcción de escape; estos están reservados para futuras extensiones del lenguaje de expresiones regulares. Se puede usar una barra invertida antes de un carácter no alfabético independientemente de si ese carácter es parte de una construcción sin escape.

Las barras invertidas dentro de los literales de cadena en el código fuente de Java se interpretan como lo requiere la especificación del lenguaje Java ™ como escapes Unicode (sección 3.3) u otros caracteres de escape (sección 3.10.6) Por lo tanto, es necesario duplicar las barras diagonales inversas en cadenas literales que representan expresiones regulares para protegerlas de la interpretación del compilador de código de bytes de Java. La cadena literal «\ b», por ejemplo, coincide con un único carácter de retroceso cuando se interpreta como una expresión regular, mientras que «\\ b» coincide con el límite de una palabra. La cadena literal «\ (hola \)» es ilegal y conduce a un error en tiempo de compilación; para que coincida con la cadena (hola), se debe utilizar la cadena literal «\\ (hola \\)».

Clases de caracteres

Las clases de caracteres pueden aparecer dentro de otras clases de caracteres, y pueden estar compuestas por el operador de unión (implícito) y el operador de intersección (& &). El operador de unión denota una clase que contiene todos los caracteres que se encuentran en al menos una de sus clases de operandos. El operador de intersección denota una clase que contiene todos los caracteres que se encuentran en sus dos clases de operandos.

La precedencia de los operadores de clase de caracteres es la siguiente, de mayor a menor:

1 Escape literal \ x
2 Agrupación
3 Rango az
4 Unión
5 Intersección ]

Tenga en cuenta que hay un conjunto diferente de metacaracteres dentro de una clase de carácter que fuera de una clase de personaje. Por ejemplo, la expresión regular. pierde su significado especial dentro de una clase de caracteres, mientras que la expresión – se convierte en un metacarácter que forma un rango.

Terminadores de línea

Un terminador de línea es una secuencia de uno o dos caracteres que marca el final de una línea de la secuencia de caracteres de entrada. Los siguientes se reconocen como terminadores de línea:

Si el modo UNIX_LINES está activado, entonces los únicos terminadores de línea reconocidos son caracteres de nueva línea.

La expresión regular. coincide con cualquier carácter excepto con un terminador de línea a menos que se especifique el indicador DOTALL.

Por defecto, las expresiones regulares ^ y $ ignoran los terminadores de línea y solo coinciden al principio y al final, respectivamente, de toda la secuencia de entrada. Si el modo MULTILINE está activado, ^ coincide al principio de la entrada y después de cualquier terminador de línea, excepto al final de la entrada. Cuando está en el modo MULTILINE $ coincide justo antes de un terminador de línea o al final de la secuencia de entrada.

Grupos y captura

Número de grupo

Los grupos de captura se numeran contando sus paréntesis de apertura de izquierda a derecha.En la expresión ((A) (B (C))), por ejemplo, hay cuatro grupos de este tipo:

1

((A) (B (C)))

2

(A)

3

(B (C))

4

(C)

El grupo cero siempre representa la expresión completa.

Los grupos de captura se denominan así porque, durante una coincidencia, se guarda cada subsecuencia de la secuencia de entrada que coincide con dicho grupo. La subsecuencia capturada se puede usar más adelante en la expresión, a través de una referencia inversa, y también se puede recuperar del comparador una vez que se complete la operación de coincidencia.

Nombre de grupo

A un grupo de captura también se le puede asignar un «nombre», un grupo de captura con nombre, y luego se puede volver a referenciar más tarde por el «nombre». Los nombres de los grupos se componen de los siguientes caracteres. El primer carácter debe ser una letra.

Un grupo de captura con nombre todavía está numerado como se describe en Número de grupo.

La entrada capturada asociada con un grupo es siempre la subsecuencia con la que el grupo ha coincidido más recientemente. Si un grupo se evalúa por segunda vez debido a la cuantificación, su valor capturado previamente, si lo hubiera, se mantendrá si la segunda evaluación falla. Al hacer coincidir la cadena «aba» con la expresión (a (b)?) +, Por ejemplo, el grupo dos se establece en «b». Toda la entrada capturada se descarta al comienzo de cada partido.

Los grupos que comienzan con (? son grupos puros, sin captura que no capturan texto y no cuentan para el total del grupo, o grupo de captura con nombre.

Soporte Unicode

Esta clase cumple con el Nivel 1 del Estándar técnico Unicode # 18: Expresión regular Unicode, más Equivalentes canónicos RL2.1.

Secuencias de escape Unicode como \ u2014 en el código fuente de Java se procesan como se describe en la sección 3.3 de la Especificación del lenguaje Java ™. Estas secuencias de escape también se implementan directamente mediante el analizador de expresiones regulares para que los escapes Unicode se puedan usar en expresiones que se leen desde archivos o desde el teclado. Por lo tanto, las cadenas » \ u2014 «y» \\ u2014 «, aunque no son iguales, se compilan en el mismo patrón, que coincide con el carácter con valor hexadecimal 0x2014.

Un carácter Unicode también se puede representar en una expresión regular usando su notación hexadecimal (valor de punto de código hexadecimal) directamente como se describe en la construcción \ x {…}, para ejemplo, se puede especificar un carácter suplementario U + 2011F como \ x {2011F}, en lugar de dos secuencias de escape Unicode consecutivas del par suplente \ uD840 \ uDD1F.

Los scripts, bloques, categorías y propiedades binarias Unicode se escriben con las construcciones \ py \ P como en Perl. \ p {prop} coincide si la entrada tiene la propiedad prop, mientras que \ P {prop} no coincide si la entrada tiene esa propiedad.

Los scripts, bloques, categorías y propiedades binarias se pueden usar tanto dentro como fuera de una clase de caracteres.

Los scripts se especifican con el prefijo Is, como en IsHiragana, o mediante el script palabra clave (o su forma abreviada sc) como en script=Hiragana o sc=Hiragana.

Los nombres de script admitidos por Pattern son los nombres de script válidos aceptados y definidos por UnicodeScript.forName.

Los bloques se especifican con el prefijo In, como en InMongolian, o mediante la palabra clave block (o su forma abreviada blk) como en block=Mongolian o blk=Mongolian.

Los nombres de bloque admitidos por Pattern son los nombres de bloque válidos aceptados y definidos por UnicodeBlock.forName.

Las categorías se pueden especificar con el prefijo opcional Is: tanto \p{L} y \p{IsL} denota la categoría de letras Unicode. Al igual que los scripts y los bloques, las categorías también se pueden especificar mediante la palabra clave general_category (o su forma abreviada gc) como en general_category=Lu o gc=Lu.

Las categorías admitidas son las del estándar Unicode en la versión especificada por la clase Character. Los nombres de las categorías son los definidos en el Estándar, tanto normativos como informativos.

Las propiedades binarias se especifican con el prefijo Is, como en IsAlphabetic.Las propiedades binarias admitidas por Pattern son

  • Alfabéticos
  • Ideográficos
  • Letra
  • Minúsculas
  • Mayúsculas
  • Titulo
  • Puntuación
  • Control
  • Espacio_blanco
  • Digit
  • Hex_Digit
  • Noncharacter_Code_Point
  • Asignado

Las clases de caracteres predefinidas y las clases de caracteres POSIX cumplen con la recomendación de Anexo C: Propiedades de compatibilidad de la expresión regular Unicode, cuando se especifica el indicador UNICODE_CHARACTER_CLASS.

Las categorías que se comportan como los métodos java.lang.Character boolean ismethodname (excepto los obsoletos) están disponibles a través de la misma sintaxis \ p {prop} donde la propiedad especificada tiene el nombre javamethodname.

Comparación con Perl 5

El motor Pattern realiza un emparejamiento tradicional basado en NFA con alternancia ordenada como ocurre en Perl 5.

Construcciones de Perl no admitidas por esta clase:

Construcciones admitidas por esta clase pero no por Perl:

  • Unión e intersección de clases de caracteres como se describe arriba.

Diferencias notables con Perl:

  • En Perl, \ 1 a \ 9 siempre se interpretan como referencias anteriores; un número de escape con barra invertida mayor que 9 se trata como una referencia inversa si existen al menos tantas subexpresiones; de lo contrario, se interpreta, si es posible, como un escape octal. En esta clase, los escapes octales deben comenzar siempre con cero. En esta clase, \ 1 a \ 9 siempre se interpretan como referencias anteriores, y se acepta un número mayor como referencia posterior si existen al menos tantas subexpresiones en ese punto de la expresión regular; de lo contrario, el analizador eliminará dígitos hasta que el número es menor o igual al número existente de grupos o es un dígito.

  • Perl usa la bandera g para solicitar una coincidencia que se reanude donde quedó la última coincidencia. Esta funcionalidad la proporciona implícitamente la clase Matcher: las invocaciones repetidas del método find se reanudarán donde lo dejó la última coincidencia, a menos que el comparador se reinicia.

  • En Perl, los indicadores incrustados en el nivel superior de una expresión afectan a toda la expresión. En esta clase, las banderas incrustadas siempre surten efecto en el punto en el que aparecen, ya sea en el nivel superior o dentro de un grupo; en el último caso, las banderas se restauran al final del grupo al igual que en Perl.

Para obtener una descripción más precisa del comportamiento de las construcciones de expresiones regulares, consulte Mastering Regular Expressions, 3nd Edition, Jeffrey EF Friedl, O «Reilly and Associates, 2006.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *