Padrão (Java Platform SE 7)

Uma representação compilada de uma expressão regular.

Uma expressão regular, especificada como uma string, deve primeiro ser compilada em uma instância desta classe. O padrão resultante pode então ser usado para criar um objeto Matcher que pode corresponder sequências de caracteres em relação à expressão regular. Todo o estado envolvido na execução de uma correspondência reside no matcher, portanto, muitos matchers podem compartilhar o mesmo padrão.

Uma sequência de invocação típica é, portanto,

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

Um método matches é definido por esta classe como uma conveniência para quando uma expressão regular é usada apenas uma vez. Este método compila uma expressão e combina uma sequência de entrada com ela em uma única chamada. A declaração

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

é equivalente às três declarações acima, embora para correspondências repetidas seja menos eficiente, uma vez que não permite que o padrão compilado seja reutilizado.

As instâncias desta classe são imutáveis e seguras para uso por vários threads simultâneos. Instâncias da classe Matcher não são seguras para tal uso.

Resumo de construções de expressão regular

Barras invertidas, escapes e aspas

O caractere de barra invertida (“\”) serve para introduzir construções de escape, conforme definido em a tabela acima, bem como para citar caracteres que, de outra forma, seriam interpretados como construções sem escape. Assim, a expressão \\ corresponde a uma única barra invertida e \ {corresponde a uma chave esquerda.

É um erro usar uma barra invertida antes de qualquer caractere alfabético que não denota uma construção de escape; eles são reservados para futuras extensões da linguagem de expressão regular. Uma barra invertida pode ser usada antes de um caractere não alfabético, independentemente de esse caractere ser parte de uma construção sem escape.

Barras invertidas em literais de string no código-fonte Java são interpretadas conforme exigido pela Especificação da linguagem Java ™ como escapes Unicode (seção 3.3) ou outros escapes de caractere (seção 3.10.6). Portanto, é necessário dobrar barras invertidas em strings literais que representam expressões regulares para protegê-los da interpretação pelo compilador de bytecode Java. A string literal “\ b”, por exemplo, corresponde a um único caractere de retrocesso quando interpretada como uma expressão regular, enquanto “\\ b” corresponde a um limite de palavra. A string literal “\ (hello \)” é ilegal e leva a um erro em tempo de compilação; para coincidir com a string (hello), a string literal “\\ (hello \\)” deve ser usada.

Classes de caracteres

As classes de caracteres podem aparecer em outras classes de caracteres e podem ser compostas pelo operador de união (implícito) e pelo operador de interseção (& &). O operador de união denota uma classe que contém todos os caracteres que estão em pelo menos uma de suas classes de operandos. O operador de interseção denota uma classe que contém todos os caracteres que estão em ambas as classes de operandos.

A precedência dos operadores de classe de caracteres é a seguinte, do maior para o menor:

1 Escape literal \ x
2 Agrupamento
3 Intervalo az
4 União
5 Intersecção ]

Observe que um conjunto diferente de metacaracteres está em vigor dentro de uma classe de caracteres e não fora de uma classe de personagem. Por exemplo, a expressão regular. perde seu significado especial dentro de uma classe de caractere, enquanto a expressão – torna-se um metacaractere que forma um intervalo.

Terminadores de linha

Um terminador de linha é uma sequência de um ou dois caracteres que marca o final de uma linha da sequência de caracteres de entrada. Os seguintes são reconhecidos como terminadores de linha:

Se o modo UNIX_LINES estiver ativado, os únicos terminadores de linha reconhecidos são caracteres de nova linha.

A expressão regular. corresponde a qualquer caractere, exceto um terminador de linha, a menos que o sinalizador DOTALL seja especificado.

Por padrão, as expressões regulares ^ e $ ignoram os terminadores de linha e só combinam no início e no final, respectivamente, de toda a seqüência de entrada. Se o modo MULTILINE estiver ativado, ^ corresponde ao início da entrada e após qualquer terminador de linha, exceto no final da entrada. Quando em MULTILINE o modo $ corresponde imediatamente antes de um terminador de linha ou no final da sequência de entrada.

Grupos e captura

Número do grupo

Os grupos de captura são numerados contando seus parênteses de abertura da esquerda para a direita.Na expressão ((A) (B (C))), por exemplo, existem quatro grupos:

1

((A) (B (C)))

2

(A)

3

(B (C))

4

(C)

Grupo zero sempre representa a expressão inteira.

Os grupos de captura recebem esse nome porque, durante uma partida, cada subsequência da sequência de entrada que corresponde a esse grupo é salva. A subsequência capturada pode ser usada posteriormente na expressão, por meio de uma referência anterior, e também pode ser recuperada do matcher assim que a operação de combinação for concluída.

Nome do grupo

Um grupo de captura também pode receber um “nome”, um grupo de captura nomeado, e então ser referenciado novamente mais tarde pelo “nome”. Os nomes dos grupos são compostos pelos seguintes caracteres. O primeiro caractere deve ser uma letra.

Um grupo de captura nomeado ainda é numerado conforme descrito em Número do grupo.

A entrada capturada associada a um grupo é sempre a subsequência que o grupo correspondeu mais recentemente. Se um grupo for avaliado uma segunda vez por causa da quantificação, seu valor capturado anteriormente, se houver, será retido se a segunda avaliação falhar. Comparar a string “aba” com a expressão (a (b)?) +, Por exemplo, deixa o grupo dois definido como “b”. Todas as entradas capturadas são descartadas no início de cada partida.

Grupos que começam com (? são grupos puros, sem captura, que não capturam texto e não contam para o total do grupo, ou grupo com captura nomeada.

Suporte para Unicode

Esta classe está em conformidade com o Nível 1 do Unicode Technical Standard # 18: Unicode Regular Expression, mais RL2.1 Canonical Equivalents.

Sequências de escape Unicode como \ u2014 no código-fonte Java são processados conforme descrito na seção 3.3 da Especificação da linguagem Java ™. Essas sequências de escape também são implementadas diretamente pelo analisador de expressão regular para que os escapes Unicode possam ser usados em expressões que são lidas de arquivos ou do teclado. Assim, as strings ” \ u2014 “e” \\ u2014 “, embora não sejam iguais, compilam no mesmo padrão, que corresponde ao caractere com valor hexadecimal 0x2014.

Um caractere Unicode também pode ser representado em uma expressão regular usando sua notação hexadecimal (valor de ponto de código hexadecimal) diretamente conforme descrito na construção \ x {…}, para Por exemplo, um caractere suplementar U + 2011F pode ser especificado como \ x {2011F}, em vez de duas sequências de escape Unicode consecutivas do par substituto \ uD840 \ uDD1F.

Scripts Unicode, blocos, categorias e propriedades binárias são escritos com as construções \ p e \ P como em Perl. \ p {prop} corresponde se a entrada tem a propriedade prop, enquanto \ P {prop} não corresponde se a entrada tem essa propriedade.

Scripts, blocos, categorias e propriedades binárias podem ser usados dentro e fora de uma classe de caracteres.

Os scripts são especificados com o prefixo Is, como em IsHiragana, ou usando o script palavra-chave (ou sua forma abreviada sc) como em script=Hiragana ou sc=Hiragana.

Os nomes de script suportados por Pattern são os nomes de script válidos aceitos e definidos por UnicodeScript.forName.

Os blocos são especificados com o prefixo In, como em InMongolian, ou usando a palavra-chave block (ou sua forma abreviada blk) como em block=Mongolian ou blk=Mongolian.

Os nomes de bloco suportados por Pattern são os nomes de bloco válidos aceitos e definidos por UnicodeBlock.forName.

As categorias podem ser especificadas com o prefixo opcional Is: \p{L} e \p{IsL} denotam a categoria de letras Unicode. Da mesma forma que scripts e blocos, as categorias também podem ser especificadas usando a palavra-chave general_category (ou sua forma abreviada gc) como em general_category=Lu ou gc=Lu.

As categorias suportadas são aquelas do Padrão Unicode na versão especificada pela classe Character. Os nomes das categorias são aqueles definidos na Norma, tanto normativos quanto informativos.

As propriedades binárias são especificadas com o prefixo Is, como em IsAlphabetic.As propriedades binárias suportadas por Pattern são

  • alfabéticas
  • ideográficas
  • letras
  • Minúsculas
  • Maiúsculas
  • Titlecase
  • Pontuação
  • Controle
  • White_Space
  • Dígito
  • Hex_Digit
  • Noncharacter_Code_Point
  • Atribuído

Classes de caracteres predefinidas e classes de caracteres POSIX estão em conformidade com a recomendação de Anexo C: Propriedades de compatibilidade da expressão regular Unicode, quando o sinalizador UNICODE_CHARACTER_CLASS é especificado.

Categorias que se comportam como os métodos booleanos ismethodname java.lang.Character (exceto para os obsoletos) estão disponíveis através da mesma sintaxe \ p {prop} onde a propriedade especificada tem o nome javamethodname.

Comparação com Perl 5

O mecanismo Pattern executa a correspondência tradicional baseada em NFA com alternância ordenada como ocorre no Perl 5.

Construções Perl não suportadas por esta classe:

Construções suportadas por esta classe, mas não por Perl:

  • União e interseção de classe de caractere conforme descrito acima.

Diferenças notáveis do Perl:

  • No Perl, \ 1 a \ 9 são sempre interpretados como referências anteriores; um número com escape de barra invertida maior que 9 é tratado como uma referência invertida se pelo menos esse número de subexpressões existir; caso contrário, ele é interpretado, se possível, como um escape octal. Nesta classe, os escapes octais devem sempre começar com zero. Nesta classe, \ 1 a \ 9 são sempre interpretados como referências anteriores, e um número maior é aceito como uma referência posterior se pelo menos essa quantidade de subexpressões existir naquele ponto da expressão regular, caso contrário, o analisador descartará dígitos até o número é menor ou igual ao número de grupos existentes ou tem um dígito.

  • O Perl usa o sinalizador g para solicitar uma correspondência que continua de onde a última partida parou. Esta funcionalidade é fornecida implicitamente pela classe Matcher: invocações repetidas do método find serão retomadas de onde a última correspondência parou, a menos que o correspondente é reiniciado.

  • Em Perl, sinalizadores embutidos no nível superior de uma expressão afetam toda a expressão. Nesta classe, os sinalizadores incorporados sempre têm efeito no ponto em que aparecem, estejam eles no nível superior ou dentro de um grupo; no último caso, os sinalizadores são restaurados no final do grupo, assim como no Perl.

Para uma descrição mais precisa do comportamento de construções de expressão regular, consulte Mastering Regular Expressions, 3ª edição, Jeffrey EF Friedl, O “Reilly and Associates, 2006.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *