Latest web development tutorials

expressões regulares Java

expressão regular define a cadeia padrão.

As expressões regulares podem ser usados ​​para pesquisar, editar ou processamento de texto.

As expressões regulares não estão limitados a um determinado idioma, mas existem diferenças sutis em cada idioma.

Java expressões regulares e Perl é o mais similar.

pacote java.util.regex inclui os seguintes três categorias:

  • Categorias padrão:

    padrão de objeto é uma representação regular de compilador expressão. classe padrão tem nenhum construtor público. Para criar um objeto padrão, você deve primeiro chamar o método de compilação público estático que retorna um objeto padrão. Este método leva a uma expressão regular como seu primeiro argumento.

  • Categorias Matcher:

    objeto Matcher é a interpretação da cadeia de entrada e operação de harmonização do motor. Como a classe Padrão, Matcher não tem nenhum construtor público. Você precisa chamar o método de objeto padrão de correspondência para obter um objeto Matcher.

  • PatternSyntaxException:

    PatternSyntaxException é uma classe de exceção não-obrigatório que representa um regular erros de sintaxe padrão de expressão.


grupo de captura

grupos de captura são vários personagens quando um único métodos de tratamento da unidade, através dos caracteres agrupados entre parênteses para criar.

Por exemplo, a expressão regular (cão) cria um único grupo, o grupo que contém "d", "o", e "g".

grupo de captura, calculando a sua parêntese de abertura contados a partir da esquerda para a direita. Por exemplo, na expressão ((A), (B (C))), há quatro desses grupos:

  • ((A), (B (C)))
  • (A)
  • (B (C))
  • (C)

Ao chamar o objeto groupCount forma de correspondência para ver quantos expressão pacotes. Método groupCount retorna um int representando o objeto de correspondência atualmente tem vários grupos de captura.

Há um grupo especial (grupo 0), ele sempre representa a expressão inteira. O grupo não está incluído no valor de retorno groupCount.

Exemplos

O exemplo a seguir mostra como encontrar uma seqüência de números de uma determinada string:

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

public class RegexMatches
{
    public static void main( String args[] ){

      // 按指定模式在字符串查找
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // 创建 Pattern 对象
      Pattern r = Pattern.compile(pattern);

      // 现在创建 matcher 对象
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      } else {
         System.out.println("NO MATCH");
      }
   }
}

Os exemplos acima são compilados os resultados como se segue:

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

sintaxe de expressão regular

personagem

explicação

\

O próximo caractere é marcado como um carácter especial, o texto, volta-referências ou de escape octal. Por exemplo, "n" corresponde ao caractere de "n". "\ N" corresponde a um caractere de nova linha. Sequência de "\\" corresponde a "\", "\ (" Match "(".

^

Combinar a cadeia de entrada começa. Se você definir a propriedadeMultiline RegExpposição do objeto de correspondência e também ^ "\ n" ou "\ r" depois.

$

Coincidir com a extremidade de entrada da posição string. Se a propriedadeMultiline do objeto RegExp,$ também coincide com o "\ n" ou posição "\ r" antes.

*

Zero ou mais vezes combina com o caractere anterior ou sub-expressão. Por exemplo, zo * corresponde a "z" e "zoo". * Equivalente a {0,}.

+

Uma ou mais vezes combina com o caractere anterior ou sub-expressão. Por exemplo, "zo +" e "zo" e jogo "zoo", mas o "z" não coincidem. + É equivalente a {1}.

?

Zero ou um combina com o caractere anterior ou sub-expressão. Por exemplo, "fazer (es)?" Corresponde ao "fazer" ou "não" no "fazer". ? Equivalente a {0,1}.

{N}

ninteiro não negativo. Combinar vezes exatamenten.Por exemplo, "o {2}" e "Bob" no "o" não corresponde, mas o "alimento" dos dois "o" jogo.

{N,}

ninteiro não negativo. Correspondência de pelo menosnvezes. Por exemplo, "o {2}" não corresponde ao "Bob" no "o", e combinar "foooood" tudo o. "O {1,}" é equivalente a "o +". "O {0,}" é equivalente a "o *".

{N,m}

Me um inteiron-negativo não,onden<= m. Correspondência de pelo menosn eno máximomvezes. Por exemplo, "o {1,3}" partidas "fooooood" nos três primeiros o. 'O {0,1}' é equivalente a 'o?'. Nota: Não é possível inserir espaços entre vírgulas e números.

?

Quando os caracteres seguido em qualquer outro qualifier (*, +,?, { N}, {n,} {n, m}) depois, o padrão de correspondência é "não-ganancioso." "Não gananciosos" correspondência de padrões para procurar possíveis cadeia curta, e o padrão padrão de "ganancioso" correspondência para procurar possíveis cadeia longa. Por exemplo, na seqüência de "oooo" em ", o +?" Encaixa-se apenas um único "o", e "o +" corresponde a todos "o".

.

Corresponde a qualquer caractere único, exceto "\ r \ n" é. Para corresponder incluem "\ r \ n", incluindo qualquer um dos personagens, como o padrão de uso "[\ s \ S]" ou algo semelhante.

(Padrão)

correspondência depadrãoe subexpressão captura do jogo. Você pode usar as propriedades$ 0 ... $ 9 combinar resultados de recolha de "matching" para recuperar capturados.Para corresponder parênteses caracteres (), use "\ (" ou "\)".

(:?Padrão)

correspondênciade padrão,mas não captar a subexpressão jogo que é um jogo não-captura, a correspondência não é armazenada para uso posterior. Isto é para uso "ou" caractere (|) quando os componentes do modo de combinação útil. Por exemplo, 'industr (?: Y | ies) é uma razão de "indústria | expressão mais econômico das indústrias.

(?= Padrão)

Realizando a frente previsão subexpression primeira corda correspondênciade padrãode busca corda no ponto da correspondência da expressão de partida. É um jogo não-captura, que não capturar o jogo para uso posterior. Por exemplo, 'do Windows (= 95 |? 98 | NT | 2000) "Matching" Windows 2000 "" Windows ", mas não coincide com o" Windows 3.1 ", no" Windows ". Lookahead não tomar personagem é, depois de ocorrer uma correspondência, o próximo jogo para a sua pesquisa imediatamente após o último jogo, não depois da primeira previsão da composição de caracteres.

(?!Pattern)

Lookahead subexpressão realizar uma pesquisa inversa, a expressão não corresponde aopadrão decadeia correspondente no ponto da cadeia de pesquisa de partida. É um jogo não-captura, que não capturar o jogo para uso posterior. Por exemplo, 'do Windows (95 | ?! 98 | NT | 2000) "corresponde ao" Windows 3.1 ", no" Windows ", mas não coincide com o" Windows 2000 "" Windows ". Lookahead não tomar personagem é, depois de ocorrer uma correspondência, o próximo jogo para a sua pesquisa imediatamente após o último jogo, não depois da primeira previsão da composição de caracteres.

x|y

Jogoxouy.Por exemplo, 'z | alimentos' corresponde a "z" ou "comida". '(Z | f) ood "match" zood "ou" comida ".

[XYZ]

Conjunto de caracteres. Corresponde a qualquer caractere incluído. Por exemplo, "[abc]" corresponde a "simples" no "a".

[^Xyz]

conjunto de caracteres inversa. Corresponde a qualquer caractere não incluído. Por exemplo, "[^ abc]" corresponde a "simples" no "p", "l", "i", "n".

[Az]

Intervalo de caracteres. Corresponde a qualquer caractere dentro do intervalo especificado. Por exemplo, "[az]" corresponde "a" a todas as letras minúsculas na faixa de "z".

[^AZ]

gama inversa de caracteres. Corresponde a qualquer caractere não dentro do intervalo especificado. Por exemplo, "[^ az]" corresponde a qualquer não "a" a qualquer um dos caracteres no intervalo de "z".

\ B

Corresponde a um limite de palavra, isto é, a posição da palavra e os espaços entre. Por exemplo, "er \ b" corresponde a "nunca" em "er", mas não coincide com o "verbo" em "er".

\ B

Combinar non-limite de palavra. "Er \ B" corresponde ao "verbo" em "er", mas não corresponde "nunca" em "er".

\C X

caractere de controle jogo indicado porx.Por exemplo, \ cM corresponde Control-M ou retorno de carro.Ovalor dexdeve estar entre AZ ou az. Se não, é assumido que C é o caráter "c" em si.

\ D

Correspondência de caracteres numéricos. Equivalente a [0-9].

\ D

Combinar caracteres não numéricos. É equivalente a [^ 0-9].

\ F

jogo formfeed. Equivalente a \ x0c e \ CL.

\ N

Combinar uma nova linha. Equivalente a \ x0a e \ cj.

\ R

Corresponde a um retorno de carro. Equivalente a \ x0d e \ cM.

\ S

Corresponde a qualquer caracteres em branco, incluindo espaços, tabulações, quebras de página, etc. Equivalente a [\ f \ n \ r \ t \ v].

\ S

Jogos quaisquer caracteres não-espaço em branco. Equivalente a [^ \ f \ n \ r \ t \ v].

\ t

guia jogo. E \ x09 e \ ci equivalente.

\ V

Corresponde a um caractere de tabulação vertical. E \ x0b e \ cK equivalente.

\ W

Corresponde a qualquer caractere caráter de classe, incluindo o sublinhado. E "[A-Za-z0-9_]" equivalente.

\ W

Corresponde a qualquer caractere não-palavra. E "[^ A-Za-z0-9_]" equivalente.

\X N

Jogon,n aqui é um hexadecimal códigos de escape. código de escape hexadecimal deve ser exatamente dois dígitos. Por exemplo, "\ x41" correspondência "A". "\ X041" e "\ x04" & "1" são equivalentes. Permite o uso de código de expressões ASCII regular.

\Num

num jogo,num aqui é um inteiro positivo. Para capturar backreferences correspondência. Por exemplo, "(.) \ 1" corresponde a dois caracteres idênticos consecutivos.

\N

Identifica um código de escape octal ou back-referências. Se \nprecedido por subexpressions pelo menosncapturados, entãoné uma referência anterior. Caso contrário, seo símbolo nrepresenta um número octal (0-7), entãoné um códigos de escape octal.

\Nm

Identifica um código de escape octal ou back-referências. Se \nmna frente de subexpressão captura de pelo menosnm,entãonmé uma referência anterior. Se \nm,pelo menos em frentedacapturan,n é um referência anterior, seguido pelo carácterm.Se os dois processos anteriores não estão presentes,\nmnmcorresponde ao valoroctal,ondenemsão dígitos octal (0-7).

\ Nml

Quandoné um número octal(0-3),M eLsão octal (0-7), que corresponde códigos de escape octaisNML.

\U n

Partidasn,ondené um caractere Unicode representado por quatro números hexadecimais. Por exemplo, \ u00A9 corresponde ao símbolo de copyright (©).

métodos de classe Matcher

Método Index

métodos de índice fornecem valores de índice úteis indicar com precisão onde encontrar os jogos cadeia de entrada:

Não. Método e Descrição
1 início int público ()
Retorna o índice inicial da partida anterior.
2 início int pública (grupo int)
Voltar em funcionamento durante o jogo anterior, capturado por um determinado grupo de índice inicial sub-sequência
3 final int público ()
Retorna o deslocamento após o último caractere correspondido.
4 final int pública (grupo int)
Voltar em funcionamento durante o jogo anterior, por um dado offset após o último grupo de caracteres após a sequência de captura.

Métodos de investigação

Métodos utilizados para verificar a cadeia de entrada e retorna um valor booleano que indica se ou não o padrão é encontrado:

Não. Método e Descrição
1 lookingAt public boolean ()
Consulte a área do início do início da sequência de entrada coincide com o padrão.
2 boolean achado pública ()
Tente encontrar a seqüência de entrada que corresponde ao padrão da próxima sequência.
3 find public boolean (início int)
Repõe esta matcher e tenta encontrar uma correspondência para o padrão, digite o seguinte sub-sequência, começando no índice especificado.
4 partidas public boolean ()
Experimente toda a correspondência região e padrão.

método de substituição

Alternativa é substituir uma string no método de entrada de texto:

Não. Método e Descrição
1 pública Matcher appendReplacement (StringBuffer sb, String de substituição)
Para atingir adições não terminais e substituições passo.
2 pública StringBuffer appendTail (StringBuffer sb)
Alcançar adições terminais e substituições etapa.
3 Cadeia replaceAll pública (substituição String)
modo de substituição com o determinado texto de substituição para coincidir com a seqüência de entrada para cada sequência.
4 Cadeia replaceFirst pública (substituição String)
modo de substituição com a string de substituição correspondente à sequência de entrada do primeiro sub-sequência.
5 pública quoteReplacement static String (String s)
Retorna uma cadeia de substituição literal string. Este método retorna uma cadeia que é passada como um método para o trabalho de classe appendReplacement Matcher como uma string literal.

iniciar e método extremidade

Aqui está um exemplo do número de ocorrências na cadeia de entrada para contar a palavra "cat" aparece:

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

public class RegexMatches
{
    private static final String REGEX = "\\bcat\\b";
    private static final String INPUT =
                                    "cat cat cat cattie cat";

    public static void main( String args[] ){
       Pattern p = Pattern.compile(REGEX);
       Matcher m = p.matcher(INPUT); // 获取 matcher 对象
       int count = 0;

       while(m.find()) {
         count++;
         System.out.println("Match number "+count);
         System.out.println("start(): "+m.start());
         System.out.println("end(): "+m.end());
      }
   }
}

Os exemplos acima são compilados os resultados como se segue:

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22

Isto pode ser visto usando os limites de palavra exemplo, para garantir que a letra "c" "a" "t" não é apenas uma longa substrings palavra. Ele também fornece algumas informações úteis sobre a cadeia de entrada é correspondido posições.

método Start retorna a operação durante a partida anterior, do grupo capturado subsequência dado índice inicial, terminar o método de combinar o último índice mais um personagem.

partidas método lookingAt

partidas e métodos lookingAt são usados ​​para tentar igualar uma seqüência de padrão de entrada. Eles são diferentes dos requisitos de toda a partida sequência de correspondência, mas não lookingAt necessário.

Estes dois métodos são muitas vezes utilizados na cadeia de entrada começa.

Através do seguinte exemplo para explicar este recurso:

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

public class RegexMatches
{
    private static final String REGEX = "foo";
    private static final String INPUT = "fooooooooooooooooo";
    private static Pattern pattern;
    private static Matcher matcher;

    public static void main( String args[] ){
       pattern = Pattern.compile(REGEX);
       matcher = pattern.matcher(INPUT);

       System.out.println("Current REGEX is: "+REGEX);
       System.out.println("Current INPUT is: "+INPUT);

       System.out.println("lookingAt(): "+matcher.lookingAt());
       System.out.println("matches(): "+matcher.matches());
   }
}

Os exemplos acima são compilados os resultados como se segue:

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

métodos replaceFirst e replaceAll

Método replaceFirst e replaceAll usado para substituir o texto correspondente expressão regular. A diferença é, replaceFirst substituir o primeiro jogo, ReplaceAll substituir todas as correspondências.

O exemplo a seguir para explicar esse recurso:

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

public class RegexMatches
{
    private static String REGEX = "dog";
    private static String INPUT = "The dog says meow. " +
                                    "All dogs say meow.";
    private static String REPLACE = "cat";

    public static void main(String[] args) {
       Pattern p = Pattern.compile(REGEX);
       // get a matcher object
       Matcher m = p.matcher(INPUT); 
       INPUT = m.replaceAll(REPLACE);
       System.out.println(INPUT);
   }
}

Os exemplos acima são compilados os resultados como se segue:

The cat says meow. All cats say meow.

métodos appendReplacement e appendTail

classe Matcher também fornece um método para appendTail appendReplacement e substituir texto:

Olhe para o seguinte exemplo para explicar este recurso:

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

public class RegexMatches
{
   private static String REGEX = "a*b";
   private static String INPUT = "aabfooaabfooabfoob";
   private static String REPLACE = "-";
   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      // 获取 matcher 对象
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()){
         m.appendReplacement(sb,REPLACE);
      }
      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

Os exemplos acima são compilados os resultados como se segue:

-foo-foo-foo-

métodos de classe PatternSyntaxException

PatternSyntaxException é uma classe de exceção não-obrigatório, o que indica um regulares erros de sintaxe padrão de expressão.

classe PatternSyntaxException fornece os seguintes métodos para nos ajudar a ver o que erro ocorreu.

Não. Método e Descrição
1 Cadeia getDescription pública ()
Obter descrição do erro.
2 getIndex int público ()
Obter o índice errado.
3 Cadeia getPattern pública ()
Obter o padrão de expressão regular errônea.
4 Cadeia getMessage pública ()
Retorna uma string multi-linha que contém a descrição de um erro de sintaxe e seu índice, uma indicação visual do padrão de expressão regular errônea, e índice de erro.