Métodos para trabalhar com grupos capturados
O código-fonte do aplicativoRegexDemo
inclui uma chamada de método m.group()
. O método group()
é um dos vários métodos da aula Matcher
que 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çadaIllegalStateException
. -
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âmetrogroup
. Observe que issogroup(0)
é equivalente agroup()
. Se o modelo não tiver um grupo capturado com o número fornecido, o método lança uma exceçãoIndexOutOfBoundsException
. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançadaIllegalStateException
. -
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çadaIllegalArgumentException
. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançadaIllegalStateException
.
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
Métodos para determinar posições de partida
A classeMatcher
fornece 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çadaIllegalStateException
. -
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âmetrogroup
. Se o modelo não tiver um grupo capturado com o número fornecido, o método lança uma exceçãoIndexOutOfBoundsException
. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançadaIllegalStateException
. -
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 chamadoname
. Se o grupo capturadoname
não estiver no modelo, uma exceção será lançadaIllegalArgumentException
. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançadaIllegalStateException
. -
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çadaIllegalStateException
. -
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âmetrogroup
. Se o modelo não tiver um grupo capturado com o número fornecido, o método lança uma exceçãoIndexOutOfBoundsException
. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançadaIllegalStateException
. -
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 chamadoname
. Se o grupo capturadoname
não estiver no modelo, uma exceção será lançadaIllegalArgumentException
. Se o resolvedor ainda não executou uma pesquisa ou se uma operação de pesquisa anterior falhou, uma exceção será lançadaIllegalStateException
.
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 classePatternSyntaxException
descreve um erro de sintaxe na expressão regular. Lança essa exceção dos métodos compile()
e matches()
da classe Pattern
e é 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 index
será 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.
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 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áriosimport 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.java
como 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
GO TO FULL VERSION