JavaRush /Blogue Java /Random-PT /Expressões regulares em Java, Parte 4

Expressões regulares em Java, Parte 4

Publicado no grupo Random-PT
Apresentamos a sua atenção a tradução de um breve guia sobre expressões regulares em Java, escrito por Jeff Friesen para o site javaworld . Para facilitar a leitura, dividimos o artigo em várias partes. Expressões regulares em Java, Parte 4 - 1 Expressões regulares em Java, Parte 1 Expressões regulares em Java, Parte 2 Expressões regulares em Java, Parte 3

Métodos para trabalhar com grupos capturados

O código-fonte do aplicativo RegexDemoinclui uma chamada de método m.group(). O método group()é um dos vários métodos da aula Matcherque visa trabalhar com grupos capturados:
  • O método int groupCount()retorna o número de grupos capturados no padrão de resolução. Este número não leva em consideração o número 0 do grupo de captura especial, que corresponde ao padrão como um todo.

  • O método String group()retorna os caracteres da correspondência anterior encontrada. Para relatar uma pesquisa bem-sucedida por uma string vazia, este método retorna uma string vazia. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançada IllegalStateException.

  • O método String group(int group)é semelhante ao método anterior, exceto que retorna os caracteres da correspondência anterior, capturados pelo número do grupo especificado pelo parâmetro group. Observe que isso group(0)é equivalente a group(). Se o modelo não tiver um grupo capturado com o número fornecido, o método lança uma exceção IndexOutOfBoundsException. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançada IllegalStateException.

  • O método String group(String name)retorna os caracteres da correspondência anterior encontrada, capturados pelo grupo de nomes. Se o nome do grupo capturado não estiver no modelo, uma exceção será lançada IllegalArgumentException. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançada IllegalStateException.

O exemplo a seguir demonstra o uso dos métodos groupCount()e group(int group):
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abc");
m.find();
System.out.println(m.groupCount());
for (int i = 0; i <= m.groupCount(); i++)
System.out.println(i + ": " + m.group(i));
Resultados de execução:
3
0: abc
1: abc
2: bc
3: c
Expressões regulares em Java, Parte 4 - 2

Métodos para determinar posições de partida

A classe Matcherfornece vários métodos que retornam as posições inicial e final de uma partida:
  • O método int start()retorna a posição inicial da correspondência anterior encontrada. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançada IllegalStateException.

  • O método int start(int group)é semelhante ao método anterior, mas retorna a posição inicial da correspondência anterior encontrada para o grupo cujo número é especificado pelo parâmetro group. Se o modelo não tiver um grupo capturado com o número fornecido, o método lança uma exceção IndexOutOfBoundsException. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançada IllegalStateException.

  • O método int start(String name)é semelhante ao método anterior, mas retorna a posição inicial da correspondência anterior encontrada para o grupo chamado name. Se o grupo capturado namenão estiver no modelo, uma exceção será lançada IllegalArgumentException. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançada IllegalStateException.

  • O método int end()retorna a posição do último caractere da correspondência anterior encontrada mais 1. Se o correspondente ainda não tiver realizado uma correspondência ou se a operação de pesquisa anterior falhou, uma exceção será lançada IllegalStateException.

  • O método int end(int group)é semelhante ao método anterior, mas retorna a posição final da correspondência anterior encontrada para o grupo cujo número é especificado pelo parâmetro group. Se o modelo não tiver um grupo capturado com o número fornecido, o método lança uma exceção IndexOutOfBoundsException. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançada IllegalStateException.

  • O método int end(String name)é semelhante ao método anterior, mas retorna a posição final da correspondência anterior encontrada para o grupo chamado name. Se o grupo capturado namenão estiver no modelo, uma exceção será lançada IllegalArgumentException. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançada IllegalStateException.

O exemplo a seguir demonstra dois métodos de localização de correspondência que geram as posições de correspondência inicial/final para o grupo de captura número 2:
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abcabcabc");
while (m.find())
{
   System.out.println("Найдено " + m.group(2));
   System.out.println("  начинается с позиции " + m.start(2) +
                      " и заканчивается на позиции " + (m.end(2) - 1));
   System.out.println();
}
A saída deste exemplo é a seguinte:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8

Métodos da classe PatternSyntaxException

Uma instância da classe PatternSyntaxExceptiondescreve um erro de sintaxe na expressão regular. Lança essa exceção dos métodos compile()e matches()da classe Patterne é formada por meio do seguinte construtor: PatternSyntaxException(String desc, String regex, int index) Este construtor armazena a descrição especificada ( desc), a expressão regular ( regex) e a posição em que ocorreu o erro de sintaxe. Se o local do erro de sintaxe for desconhecido, o valor indexserá definido como -1. Muito provavelmente, você nunca precisará criar instâncias do PatternSyntaxException. No entanto, você precisará extrair os valores acima ao criar uma mensagem de erro formatada. Para fazer isso, você pode usar os seguintes métodos:
  • O método String getDescription()retorna uma descrição do erro de sintaxe.
  • O método int getIndex()retorna a posição em que ocorreu o erro ou -1 se a posição for desconhecida.
  • O método String getPattern()retorna uma expressão regular inválida.
Além disso, o método herdado String getMessage()retorna uma string multilinha com os valores retornados dos métodos anteriores junto com uma indicação visual de onde ocorreu o erro de sintaxe no modelo. O que é um erro de sintaxe? Aqui está um exemplo: java RegexDemo (?itree Treehouse Neste caso, esquecemos de especificar o metacaractere entre parênteses de fechamento ( )) na expressão do sinalizador aninhado. Isto é o resultado deste erro:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
   ^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree

Crie aplicativos úteis de expressão regular usando a API Regex

Expressões regulares permitem criar aplicativos poderosos de processamento de texto. Nesta seção, mostraremos dois aplicativos úteis que irão encorajá-lo a explorar ainda mais as classes e métodos da API Regex. O segundo apêndice apresenta Lexan: uma biblioteca de códigos reutilizáveis ​​para realizar análises lexicais. Expressões regulares em Java, Parte 4 - 3

Expressões regulares e documentação

A documentação é uma das tarefas obrigatórias no desenvolvimento de software profissional. Felizmente, as expressões regulares podem ajudá-lo em muitos aspectos da criação de documentação. O código na Listagem 1 extrai linhas contendo comentários estilo C de linha única e multilinha de um arquivo de origem e os grava em outro arquivo. Para que o código funcione, os comentários devem estar na mesma linha. Listagem 1. Recuperando comentários
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class ExtCmnt
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("Способ применения: java ExtCmnt infile outfile");
         return;
      }

      Pattern p;
      try
      {
         // Следующий шаблон определяет многострочные комментарии,
         // располагающиеся в одной строке (например, /* одна строка */)
            // и однострочные комментарии (например, // Howая-то строка).
            // Комментарий может располагаться в любом месте строки.

         p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
      }
      catch (PatternSyntaxException pse)
      {
         System.err.printf("Синтаксическая ошибка в регулярном выражении: %s%n", pse.getMessage());
         System.err.printf("Описание ошибки: %s%n", pse.getDescription());
         System.err.printf("Позиция ошибки: %s%n", pse.getIndex());
         System.err.printf("Ошибочный шаблон: %s%n", pse.getPattern());
         return;
      }

      try (FileReader fr = new FileReader(args[0]);
           BufferedReader br = new BufferedReader(fr);
           FileWriter fw = new FileWriter(args[1]);
           BufferedWriter bw = new BufferedWriter(fw))
      {
         Matcher m = p.matcher("");
         String line;
         while ((line = br.readLine()) != null)
         {
            m.reset(line);
            if (m.matches()) /* Должна соответствовать вся строка */
            {
               bw.write(line);
               bw.newLine();
            }
         }
      }
      catch (IOException ioe)
      {
         System.err.println(ioe.getMessage());
         return;
      }
   }
}
O método main()na Listagem 1 primeiro verifica a sintaxe correta da linha de comando e, em seguida, compila uma expressão regular projetada para detectar comentários de linhas únicas e múltiplas em um objeto de classe Pattern. Se nenhuma exceção for gerada PatternSyntaxException, o método main()abre o arquivo de origem, cria o arquivo de destino, obtém um correspondente para corresponder cada linha lida ao padrão e, em seguida, lê o arquivo de origem linha por linha. Para cada linha, é correspondido um padrão de comentário. Se for bem-sucedido, o método main()grava a string (seguida por uma nova linha) no arquivo de destino (abordaremos a lógica de E/S do arquivo em um futuro tutorial do Java 101). Compile a Listagem 1 da seguinte maneira: javac ExtCmnt.java Execute o aplicativo com o arquivo ExtCmnt.javacomo entrada: java ExtCmnt ExtCmnt.java out Você deve obter os seguintes resultados na saída do arquivo:
// Следующий шаблон определяет многострочные комментарии,
 // располагающиеся в одной строке (например, /* одна строка */)
    // и однострочные комментарии (например, // Howая-то строка).
    // Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
    if (m.matches()) /* Должна соответствовать вся строка */
Na string padrão .*/\\*.*\\*/|.*//.*$, o metacaractere pipe |atua como um operador lógico OR, indicando que o correspondente deve usar o operando esquerdo da construção da expressão regular fornecida para encontrar uma correspondência no texto do correspondente. Se não houver correspondências, o correspondente usa o operando correto da construção da expressão regular fornecida para outra tentativa de pesquisa (os metacaracteres entre parênteses no grupo capturado também formam um operador lógico). Expressões regulares em Java, Parte 5
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION