Expressões regulares definem padrões de strings.
Expressões regulares podem ser usadas para pesquisar, editar ou manipular texto.
As expressões regulares não estão limitadas a um idioma, mas existem diferenças sutis em cada idioma.
As expressões regulares Java são mais semelhantes às do Perl.
O pacote java.util.regex inclui principalmente as três classes a seguir:
Classe padrão:
O objeto padrão é uma representação compilada de uma expressão regular. A classe padrão não possui construtor público. Para criar um objeto Pattern, você deve primeiro chamar seu método de compilação estático público, que retorna um objeto Pattern. Este método aceita uma expressão regular como primeiro parâmetro.
Classe de correspondência:
O objeto Matcher é um mecanismo que interpreta e combina strings de entrada. Assim como a classe Pattern, Matcher não possui construtor público. Você precisa chamar o método matcher do objeto Pattern para obter um objeto Matcher.
PatternSyntaxException:
PatternSyntaxException é uma classe de exceção não obrigatória que representa um erro de sintaxe em um padrão de expressão regular.
A captura de grupos é uma forma de tratar vários caracteres como uma única unidade, criada agrupando caracteres entre parênteses.
Por exemplo, a expressão regular (cachorro) cria um único grupo contendo “d”, “o” e “g”.
Os grupos de captura são numerados contando seus colchetes de abertura da esquerda para a direita. Por exemplo, na expressão ((A)(B(C))), existem quatro desses grupos:
((ABC)))
(UM)
(B(C))
(C)
Você pode verificar quantos grupos uma expressão possui chamando o método groupCount do objeto correspondente. O método groupCount retorna um valor int, indicando que o objeto correspondente possui atualmente vários grupos de captura.
Existe também um grupo especial (grupo 0) que sempre representa a expressão inteira. O grupo não está incluído no valor de retorno de groupCount.
O exemplo a seguir mostra como encontrar uma sequência de dígitos de uma determinada sequência:
importar java.util.regex.Matcher;
importar java.util.regex.Pattern;
classe pública RegexMatches
{
public static void main(String args[]){
// Pesquisa a string de acordo com o padrão especificado String line = "Este pedido foi feito para QT3000! OK?";
Padrão de string = "(.*)(\d+)(.*)";
//Criar objeto Padrão Pattern r = Pattern.compile(pattern);
// Agora cria o objeto matcher Matcher m = r.matcher(line);
if (m.find()) {
System.out.println("Valor encontrado: " + m.group(0) );
System.out.println("Valor encontrado: " + m.group(1) );
System.out.println("Valor encontrado: " + m.group(2) );
} outro {
System.out.println("SEM CORRESPONDÊNCIA");
}
}
}
Os resultados de compilação e execução do exemplo acima são os seguintes:
Valor encontrado: Este pedido foi feito para QT3000, OK?
Valor encontrado: Este pedido foi feito para QT300
Valor encontrado: 0
personagem | ilustrar |
---|---|
| Marque o próximo caractere como um caractere especial, texto, referência anterior ou caractere de escape octal. Por exemplo, “n” corresponde ao caractere “n”. "n" corresponde a um caractere de nova linha. A sequência "\" corresponde a "" e "(" corresponde a "(". |
^ | Corresponde ao início da string de entrada. Se a propriedade Multiline do objeto RegExp estiver definida, ^ também corresponderá à posição após "n" ou "r". |
$ | Corresponde ao final da string de entrada. Se a propriedade Multiline do objeto RegExp estiver definida, $ também corresponderá à posição antes de "n" ou "r". |
* | Corresponde ao caractere ou subexpressão anterior zero ou mais vezes. Por exemplo, zo* corresponde a "z" e "zoo". * Equivalente a {0,}. |
+ | Corresponde ao caractere ou subexpressão anterior uma ou mais vezes. Por exemplo, "zo+" corresponde a "zo" e "zoo", mas não a "z". + Equivalente a {1,}. |
? | Corresponde ao caractere ou subexpressão anterior zero ou uma vez. Por exemplo, "do(es)?" corresponde a "do" ou "do" em "does". ? Equivalente a {0,1}. |
{ n } | n é um número inteiro não negativo. Combine exatamente n vezes. Por exemplo, "o{2}" não corresponde ao "o" em "Bob", mas corresponde a ambos os "o"s em "comida". |
{ n ,} | n é um número inteiro não negativo. Combine pelo menos n vezes. Por exemplo, "o{2,}" não corresponde ao "o" em "Bob", mas corresponde a todos os o's em "foooood". "o{1,}" é equivalente a "o+". "o{0,}" é equivalente a "o*". |
{ n , m } | M e n são inteiros não negativos, onde n <= m . Combine pelo menos n vezes e no máximo m vezes. Por exemplo, "o{1,3}" corresponde aos três primeiros o's em "fooooood". 'o{0,1}' é equivalente a 'o?'. Nota: Não é possível inserir espaços entre vírgulas e números. |
? | Quando este caractere segue imediatamente qualquer outro qualificador (*, +, ?, { n }, { n ,}, { n , m }), o padrão de correspondência é "não ganancioso". O padrão "não-ganancioso" corresponde à string mais curta possível, enquanto o padrão "ganancioso" corresponde à string mais longa possível. Por exemplo, na string "oooo", "o+?" corresponde apenas a um único "o", enquanto "o+" corresponde a todos os "o". |
. | Corresponde a qualquer caractere único, exceto "rn". Para corresponder a qualquer caractere, incluindo "rn", use um padrão como "[sS]". |
( padrão ) | Corresponde a um padrão e captura a subexpressão correspondente. As correspondências capturadas podem ser recuperadas da coleção de "correspondências" resultante usando os atributos $0…$9 . Para corresponder ao caractere de colchete ( ), use "(" ou ")". |
(?: padrão ) | Uma subexpressão que corresponde ao padrão , mas não captura a correspondência, ou seja, é uma correspondência sem captura e não armazena a correspondência para uso posterior. Isto é útil ao combinar partes do padrão usando o caractere "ou" (|). Por exemplo, 'industr(?:y|ies) é uma expressão mais econômica do que 'industry|industries'. |
(?= padrão ) | Uma subexpressão que executa uma pesquisa antecipada que corresponde a uma string no início de uma string que corresponde a pattern . É uma partida sem captura, ou seja, uma partida que não pode ser capturada para uso posterior. Por exemplo, 'Windows (?=95|98|NT|2000)' corresponde a "Windows" em "Windows 2000", mas não a "Windows" em "Windows 3.1". As antecipações de previsão não ocupam caracteres, ou seja, após a ocorrência de uma correspondência, a próxima correspondência é pesquisada imediatamente após a correspondência anterior, e não após os caracteres que compõem a previsão antecipada. |
(?! padrão ) | Uma subexpressão que executa uma pesquisa retroativa que corresponde a uma sequência de pesquisa que não está no início de uma sequência que corresponde a pattern . É uma partida sem captura, ou seja, uma partida que não pode ser capturada para uso posterior. Por exemplo, 'Windows (?!95|98|NT|2000)' corresponde a "Windows" em "Windows 3.1", mas não a "Windows" em "Windows 2000". As antecipações de previsão não ocupam caracteres, ou seja, após a ocorrência de uma correspondência, a próxima correspondência é pesquisada imediatamente após a correspondência anterior, e não após os caracteres que compõem a previsão antecipada. |
x | | Combine x ou y . Por exemplo, 'z|food' corresponde a "z" ou "food". '(z|f)ood' corresponde a "zood" ou "comida". |
[ xyz ] | Conjunto de caracteres. Corresponde a qualquer caractere contido em . Por exemplo, "[abc]" corresponde ao "a" em "simples". |
[^ xyz ] | Conjunto de caracteres reversos. Corresponde a quaisquer caracteres não incluídos. Por exemplo, "[^abc]" corresponde a "p", "l", "i" e "n" em "simples". |
[ az ] | Gama de caracteres. Corresponde a qualquer caractere dentro do intervalo especificado. Por exemplo, "[az]" corresponde a qualquer letra minúscula no intervalo de "a" a "z". |
[^ az ] | Caractere de intervalo reverso. Corresponde a qualquer caractere que não esteja dentro do intervalo especificado. Por exemplo, "[^az]" corresponde a qualquer caractere que não esteja no intervalo de "a" a "z". |
b | Corresponde a um limite de palavra, ou seja, a posição entre uma palavra e um espaço. Por exemplo, "erb" corresponde a "er" em "nunca", mas não a "er" em "verbo". |
B | Correspondência de limites sem palavras. "erB" corresponde ao "er" em "verbo", mas não ao "er" em "nunca". |
cx | Corresponde ao caractere de controle indicado por x . Por exemplo, cM corresponde a Control-M ou a um caractere de retorno de carro. O valor de x deve estar entre AZ ou az. Se este não for o caso, c será considerado o próprio caractere “c”. |
d | Correspondência de caracteres numéricos. Equivalente a [0-9]. |
D | Corresponde a caracteres não numéricos. Equivalente a [^0-9]. |
f | Correspondências de feed de formulário. Equivalente a x0c e cL. |
n | Correspondência de nova linha. Equivalente a x0a e cJ. |
r | Corresponde a um caractere de retorno de carro. Equivalente a x0d e cM. |
s | Corresponde a qualquer caractere de espaço em branco, incluindo espaços, tabulações, feeds de formulário, etc. Equivalente a [fnrtv]. |
S | Corresponde a qualquer caractere que não seja espaço em branco. Equivalente a [^fnrtv]. |
t | Correspondência de guias. Equivalente a x09 e cI. |
v | Correspondência de guias verticais. Equivalente a x0b e cK. |
c | Corresponde a qualquer tipo de caractere, incluindo sublinhado. Equivalente a "[A-Za-z0-9_]". |
C | Corresponde a qualquer caractere que não seja de palavra. Equivalente a "[^A-Za-z0-9_]". |
xn | Corresponde a n , onde n é um código de escape hexadecimal. O código de escape hexadecimal deve ter exatamente dois dígitos. Por exemplo, "x41" corresponde a "A". "x041" é equivalente a "x04"&"1". Permitir códigos ASCII em expressões regulares. |
num | Corresponde a num , onde num é um número inteiro positivo. Referência retroativa para capturar a correspondência. Por exemplo, "(.)1" corresponde a dois caracteres idênticos consecutivos. |
n | Identifica um código de escape octal ou referência anterior. Se n for precedido por pelo menos n subexpressões de captura, então n é uma referência anterior. Caso contrário, se n for um número octal (0-7), então n será o código de escape octal. |
nm | Identifica um código de escape octal ou referência anterior. Se nm for precedido por pelo menos nm capturando subexpressões, então nm é uma referência retroativa. Se nm for precedido por pelo menos n capturas, n será uma referência anterior seguida pelo caractere m . Se nenhuma das condições anteriores existir, nm corresponde ao valor octal nm , onde n e m são dígitos octais (0-7). |
nml | Quando n é um número octal (0-3) e m e l são números octais (0-7), corresponda ao código de escape octal nml . |
u n | Corresponde a n , onde n é um caractere Unicode representado como um número hexadecimal de quatro dígitos. Por exemplo, u00A9 corresponde ao símbolo de copyright (©). |
O método index fornece valores de índice úteis que indicam exatamente onde a correspondência é encontrada na string de entrada:
número de série | Métodos e instruções |
---|---|
1 | public int start() retorna o índice inicial da correspondência anterior. |
2 | public int start(int group) Retorna o índice inicial da subsequência capturada por um determinado grupo durante a operação de correspondência anterior |
3 | public int end() retorna o deslocamento após o último caractere correspondente. |
4 | public int end(int group) Retorna o deslocamento após o último caractere da subsequência capturada por um determinado grupo durante a operação de correspondência anterior. |
O método de pesquisa examina a string de entrada e retorna um valor booleano indicando se o padrão foi encontrado:
número de série | Métodos e instruções |
---|---|
1 | public boolean LookingAt() tenta corresponder uma sequência de entrada começando no início do intervalo com este padrão. |
2 | public boolean find() tenta encontrar a próxima subsequência da sequência de entrada que corresponde a este padrão. |
3 | public boolean find(int start) Redefine este matcher e então tenta encontrar a próxima subsequência da sequência de entrada começando no índice especificado que corresponde a este padrão. |
4 | public boolean matches() tenta combinar todo o intervalo com o padrão. |
O método de substituição é um método para substituir texto na string de entrada:
número de série | Métodos e instruções |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) implementa etapas de adição e substituição não terminais. |
2 | public StringBuffer appendTail(StringBuffer sb) implementa as etapas de adição e substituição de terminal. |
3 | public String replaceAll(String replacement) Substitui cada subsequência da sequência de entrada cujo padrão corresponde à string de substituição fornecida. |
4 | public String replaceFirst(String replacement) Substitui a primeira subsequência da sequência de entrada cujo padrão corresponde à string de substituição fornecida. |
5 | public static String quoteReplacement(String s) retorna a string de substituição literal da string especificada. Este método retorna uma string que funciona exatamente como uma string literal passada para o método appendReplacement da classe Matcher. |
Aqui está um exemplo de contagem do número de ocorrências da palavra "gato" em uma string de entrada:
importar java.util.regex.Matcher;
importar java.util.regex.Pattern;
classe pública RegexMatches
{
private static final String REGEX = "\bcat\b";
String final estático privado INPUT =
"gato gato gato gato gato";
public static void main(String args[]){
Padrão p = Padrão.compile(REGEX);
Matcher m = p.matcher(INPUT); // Obtém o objeto matcher int count = 0;
enquanto(m.find()) {
contar++;
System.out.println("Número correspondente "+contagem);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
Os resultados de compilação e execução do exemplo acima são os seguintes:
Jogo número 1
início(): 0
fim(): 3
Jogo número 2
início(): 4
fim(): 7
Jogo número 3
início(): 8
fim(): 11
Jogo número 4
início(): 19
fim(): 22
Você pode ver que este exemplo usa limites de palavras para garantir que as letras "c" "a" "t" não sejam apenas uma substring de uma palavra mais longa. Ele também fornece algumas informações úteis sobre onde ocorreu a correspondência na string de entrada.
O método start retorna o índice inicial da subsequência capturada por um determinado grupo durante a operação de correspondência anterior, e o método end adiciona um ao índice do último caractere correspondido.
Os métodos matches e LookingAt são usados para tentar corresponder a um padrão de sequência de entrada. A diferença entre eles é que matches requer que toda a sequência corresponda, enquanto o lookAt não.
Esses dois métodos são frequentemente usados no início da string de entrada.
Usamos o seguinte exemplo para explicar esta função:
importar java.util.regex.Matcher;
importar java.util.regex.Pattern;
classe pública RegexMatches
{
final estático privado String REGEX = "foo";
private static final String INPUT = "fooooooooooooooooo";
padrão estático privado;
matcher estático privado;
public static void main(String args[]){
padrão = Padrão.compile(REGEX);
matcher = padrão.matcher(INPUT);
System.out.println("REGEX atual é: "+REGEX);
System.out.println("ENTRADA atual é: "+ENTRADA);
System.out.println("olhandoAt(): "+matcher.olhandoAt());
System.out.println("correspondências(): "+correspondência.correspondências());
}
}
Os resultados de compilação e execução do exemplo acima são os seguintes:
REGEX atual é: foo
A ENTRADA atual é: fooooooooooooooooo
olhandoAt(): verdadeiro
correspondências(): falso
Os métodos replaceFirst e replaceAll são usados para substituir o texto que corresponde a uma expressão regular. A diferença é que replaceFirst substitui a primeira correspondência e replaceAll substitui todas as correspondências.
O exemplo a seguir explica essa funcionalidade:
importar java.util.regex.Matcher;
importar java.util.regex.Pattern;
classe pública RegexMatches
{
private static String REGEX = "cachorro";
private static String INPUT = "O cachorro diz miau." +
"Todos os cachorros dizem miau.";
string estática privada REPLACE = "gato";
public static void main(String[] args) {
Padrão p = Padrão.compile(REGEX);
//obtém um objeto correspondente
Correspondente m = p.correspondente(INPUT);
ENTRADA = m.replaceAll(REPLACE);
System.out.println(ENTRADA);
}
}
Os resultados de compilação e execução do exemplo acima são os seguintes:
O gato diz miau. Todos os gatos dizem miau.
A classe Matcher também fornece métodosappendReplacement eappendTail para substituição de texto:
Veja o exemplo a seguir para explicar essa funcionalidade:
importar java.util.regex.Matcher;
importar java.util.regex.Pattern;
classe pública RegexMatches
{
string estática privada REGEX = "a*b";
String estática privada INPUT = "aabfooaabfooabfoob";
String estática privada REPLACE = "-";
public static void main(String[] args) {
Padrão p = Padrão.compile(REGEX);
// Obtém o objeto correspondente Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
enquanto(m.find()){
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
Os resultados de compilação e execução do exemplo acima são os seguintes:
-foo-foo-foo-
PatternSyntaxException é uma classe de exceção não forçada que indica um erro de sintaxe em um padrão de expressão regular.
A classe PatternSyntaxException fornece os seguintes métodos para nos ajudar a ver quais erros ocorreram.
número de série | Métodos e instruções |
---|---|
1 | public String getDescription() Obtém a descrição do erro. |
2 | public int getIndex() obtém o índice errado. |
3 | public String getPattern() obtém o padrão de expressão regular errado. |
4 | public String getMessage() retorna uma string multilinha contendo uma descrição do erro de sintaxe e seu índice, o padrão de expressão regular do erro e uma indicação visual do índice do erro no padrão. |