Latest web development tutorials

Java espressioni regolari

espressione regolare definisce la stringa modello.

Le espressioni regolari possono essere utilizzati per la ricerca, modificare o elaborazione del testo.

Le espressioni regolari non sono limitati a una certa lingua, ma ci sono sottili differenze in ogni lingua.

Java espressioni regolari e Perl è la più simile.

pacchetto java.util.regex comprende le seguenti tre categorie:

  • categorie del modello:

    modello oggetto è una rappresentazione espressione regolare compilatore. classe del modello non ha costruttore pubblico. Per creare un oggetto del modello, è necessario innanzitutto chiamare il suo metodo di compilazione public static che restituisce un oggetto modello. Questo metodo prende un'espressione regolare come primo argomento.

  • categorie Matcher:

    oggetto Matcher è l'interpretazione della stringa di input e il funzionamento corrispondenza del motore. Come la classe del modello, Matcher non ha costruttore pubblico. È necessario chiamare il modello oggetto Matcher metodo per ottenere un oggetto Matcher.

  • PatternSyntaxException:

    PatternSyntaxException è una classe di eccezione non obbligatorio che rappresenta un normale errori di sintassi del modello di espressione.


gruppo di cattura

gruppi di cattura sono più caratteri in cui un singolo metodi di trattamento unità, attraverso i personaggi raggruppati tra parentesi a creare.

Ad esempio, l'espressione regolare (cane) crea un unico gruppo, il gruppo che contiene "d", "O", e "g".

gruppo Capture calcolando la sua parentesi aperta numerati da sinistra a destra. Ad esempio, nell'espressione ((A) (B (C))), ci sono quattro gruppi:

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

Chiamando il matcher oggetto groupCount modo per vedere quanti espressione pacchetti. Metodo groupCount restituisce un int che rappresenta l'oggetto matcher attualmente ha più gruppi di acquisizione.

C'è un gruppo speciale (gruppo 0), rappresenta sempre l'intera espressione. Il gruppo non è incluso nel valore di ritorno groupCount.

Esempi

L'esempio seguente mostra come trovare una stringa di numeri da una stringa:

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");
      }
   }
}

Gli esempi sopra risultati elaborati sono i seguenti:

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

sintassi delle espressioni regolari

carattere

spiegazione

\

Il carattere successivo è contrassegnato come un carattere speciale, testo, back-riferimenti o escape ottale. Ad esempio, "n" corrisponde al carattere "n". "\ N" corrisponde a un carattere di nuova riga. Sequenza "\\" partite "\", "\ (" Match "(".

^

Trova inizia la stringa di input. Se si imposta la proprietàRegExp posizione di oggetto corrispondente multilineae anche ^ "\ n" o "\ r" dopo.

$

Partita la fine di ingresso della posizione della stringa. Se la proprietàMultiline dell'oggetto RegExp,$ anche partite con il "\ n" o posizione "\ r" prima.

*

Zero o più volte Corrisponde al carattere precedente o sub-espressione. Ad esempio, zo * corrisponde a "Z" e "zoo". * Equivalente a {0,}.

+

Una o più volte Corrisponde al carattere precedente o sub-espressione. Ad esempio, "zo +" e "zo" and match "zoo", ma la "z" non corrispondono. + È equivalente a {1}.

?

Zero o uno corrisponde al carattere precedente o sub-espressione. Ad esempio, "fare (es)?" Corrisponde al "fare" o "fa" nel "fare". ? Equivalente a {0,1}.

{N}

nnumero intero non negativo. Corrispondere esattamentenvolte. Ad esempio, "O {2}" e "Bob" nel "o" non corrisponde, ma il "cibo" dei due "o" match.

{N,}

nnumero intero non negativo. Partita almenonvolte. Ad esempio, "O {2,}" non corrisponde al "Bob" nel "o", e match "foooood" tutto o. "O {1,}" è equivalente a "O +". "O {0,}" è equivalente a "o *".

{N,m}

Me un numero intero non negativon,doven<= m. Partita almenon edal più voltem.Ad esempio, "o {1,3}" partite "FOOOOOOD" nei primi tre o. 'O {0,1}' equivale a 'o?'. Nota: non è possibile inserire spazi tra le virgole e numeri.

?

Quando i personaggi seguiti in qualsiasi altro qualificatore (*, +,?, { N}, {n,}, {n, m}) dopo, il pattern matching è "non-avido." "Non-greedy" pattern matching per la ricerca di possibili stringa breve, e il valore predefinito modello "greedy" corrispondenza per la ricerca di possibili stringhe lungo. Ad esempio, nella stringa "oooo" in ", o +?" Corrisponde a un solo "o", e "O +" corrispondere a tutti "o".

.

Corrisponde a qualsiasi singolo carattere eccetto "\ r \ n" è. Per abbinare includere "\ r \ n", tra cui uno qualsiasi dei personaggi, come ad esempio il tipo di impiego "[\ s \ S]" o simili.

(Pattern)

Il patternmatching e la cattura sottoespressione della partita. È possibile utilizzare le proprietà$ 0 ... $ 9 coi risultati da collezione "matching" per recuperare catturato.Per far corrispondere i caratteri di parentesi (), utilizzare "\ (" o "\)."

(:?Pattern)

patternmatching, ma non cattura la partita sottoespressione che si tratta di un match non-cattura, la corrispondenza non viene memorizzato per un uso successivo. Questo è per uso "o" carattere (|) quando i componenti in modalità utile combinazione. Ad esempio, 'industr? (: Y | i) è un rapporto di' industria | espressione più economico industrie.

(?= Pattern)

Esecuzione in avanti previsione subexpression prima stringa dipatternmatching stringa di ricerca al punto di partenza della corrispondenza espressione. Si tratta di un match non-cattura, che non rifletta la partita per un uso successivo. Ad esempio, 'Windows (= 95 |? 98 | NT | 2000)' Corrispondenza "Windows 2000" "Windows", ma non corrisponde al "Windows 3.1" in "Windows". Lookahead non prendere personaggio è, quando si verifica una corrispondenza, la prossima partita per la ricerca immediatamente dopo l'ultima partita, non dopo la prima previsione nella composizione di caratteri.

(?!Pattern)

Lookahead sottoespressione eseguire una ricerca inversa, l'espressione non corrisponde almodello distringa corrispondente al punto di partenza della stringa di ricerca. Si tratta di un match non-cattura, che non rifletta la partita per un uso successivo. Ad esempio, 'Windows (95 | ?! 98 | NT | 2000)' corrisponde al "Windows 3.1" in "Windows", ma non corrisponde al "Windows 2000" "Windows". Lookahead non prendere personaggio è, quando si verifica una corrispondenza, la prossima partita per la ricerca immediatamente dopo l'ultima partita, non dopo la prima previsione nella composizione di caratteri.

x|y

Partitaxoy. Per esempio, 'z | cibo' corrisponde a "z" o "cibo". '(Z | f) ood' partita "zood" o "cibo".

[Xyz]

Set di caratteri. Corrisponde a qualsiasi carattere incluso. Ad esempio, "[abc]" corrisponde a "pianura" nella "a".

[^Xyz]

set di caratteri inverso. Corrisponde a qualsiasi carattere non incluso. Ad esempio, "[^ abc]" corrisponde a "pianura" nella "p", "l", "i", "n".

[AZ]

Intervallo di caratteri. Corrisponde a qualsiasi carattere all'interno dell'intervallo specificato. Ad esempio, "[az]" verifica "a" per eventuali lettere minuscole della serie "Z".

[^Az]

gamma inversione di caratteri. Corrisponde a qualsiasi carattere non compreso nell'intervallo specificato. Ad esempio, "[^ az]" indica qualsiasi non "a" qualsiasi caratteri nell'intervallo "z".

\ B

Corrisponde a un limite di parola, che è, la posizione della parola e gli spazi tra. Ad esempio, "er \ b" corrisponde a "mai" in "ER", ma non corrisponde al "verbo" in "ER".

\ B

Partita di non limite di parola. "Er \ B" corrisponde al "verbo" in "ER", ma non corrisponde "mai" in "ER".

\C x

carattere di controllo Partita indicato dax.Ad esempio, \ cM corrisponde Control-M o ritorno a capo.Ilvalore dixdeve essere tra AZ o az. In caso contrario, si presume che c è il carattere "c" stesso.

\ D

Corrispondenza caratteri numerici. Equivalente a [0-9].

\ D

Abbinare caratteri non numerici. E 'equivalente a [^ 0-9].

\ F

partita formfeed. Equivalente a \ x0c e \ cl.

\ N

Abbinare un ritorno a capo. Equivalente a \ x0a e \ cJ.

\ R

Corrisponde a un ritorno a capo. Equivalente a \ x0d e \ CM.

\ S

Corrisponde a qualsiasi carattere di spazio bianco, compresi gli spazi, tabulazioni, interruzioni di pagina, ecc Equivalente a [\ f \ n \ r \ t \ v].

\ S

Corrisponde a qualsiasi carattere non di spaziatura. Equivalente a [^ \ f \ n \ r \ t \ v].

\ T

scheda Partita. E \ X09 e \ ci equivalente.

\ V

Corrisponde a un carattere di tabulazione verticale. E \ x0b e \ cK equivalente.

\ W

Corrisponde a qualsiasi carattere carattere di classe, tra cui sottolineatura. E "[A-Za-z0-9_]" equivalente.

\ W

Corrisponde a qualsiasi carattere non-parola. E "[^ A-Za-z0-9_]" equivalente.

\X n

Partitan,n ecco un codici di escape esadecimali. codice di escape esadecimale deve essere esattamente lungo due cifre. Ad esempio, "\ x41" corrispondenti "A". "\ X041" e "\ x04" e "1" sono equivalenti. Consente l'uso di regolare codice ASCII espressioni.

\Num

Partitanum,num qui è un numero intero positivo. Per catturare backreference corrispondenza. Ad esempio, "(.) \ 1" indica due caratteri consecutivi identici.

\N

Identifica un codice di escape ottale o back-riferimenti. Se \npreceduto da sottoespressioni almenoncatturati, alloranè un backreference. Altrimenti, senè un numero ottale (0-7), alloranè un ottali codici di escape.

\Nm

Identifica un codice di escape ottale o back-riferimenti. Se \nmdavanti almenonmsubexpression cattura, poinmè un backreference. Se \nmalmenodavanticatturan,n è un backreference, seguito dal caratterem.Se i due casi precedenti non sono presenti,\nm partite valore ottalenm,dovenedmsono cifre ottali (0-7).

\ Nml

Quandonè un numero ottale(0-3),M eLsono ottale (0-7), che corrisponde a codici di escape ottaleNML.

\U n

Partiten,dovenè un carattere Unicode rappresentata da quattro numeri esadecimali. Ad esempio, \ u00a9 corrisponde al simbolo di copyright (©).

metodi di classe Matcher

Metodo Indice

metodi Indice forniscono valori di indice utili indicano esattamente dove trovare le partite stringa di input:

No. Metodo e Descrizione
1 public int start ()
Restituisce l'indice iniziale della partita precedente.
2 public int inizio (gruppo int)
Di nuovo in funzione durante la partita precedente, catturato da un dato gruppo di indice iniziale sub-sequenza
3 public int end ()
Restituisce l'offset dopo l'ultimo carattere abbinato.
4 end public int (gruppo int)
Di nuovo in funzione durante la partita precedente, per un dato scostamento dopo l'ultimo gruppo di caratteri dopo la sequenza di cattura.

Metodi di ricerca

I metodi utilizzati per verificare la stringa di input e restituisce un valore booleano che indica se il modello viene trovato:

No. Metodo e Descrizione
1 lookingat public boolean ()
Prova nella zona dall'inizio di inizio della sequenza di input corrisponde al modello.
2 find public boolean ()
Prova a trovare la sequenza di ingresso che corrisponde al modello della sequenza successiva.
3 public boolean find (int start)
Riporta questo Matcher e quindi tenta di trovare una corrispondenza per il modello, inserire il prossimo sub-sequenza a partire dall'indice specificato.
4 partite public boolean ()
Prova l'intera corrispondenza regione ed il modello.

metodo di sostituzione

Alternativa è quello di sostituire una stringa nel metodo di immissione del testo:

No. Metodo e Descrizione
1 pubblico Matcher appendReplacement (StringBuffer sb, String sostituzione)
Per ottenere le aggiunte non terminali e sostituzioni passo.
2 pubblico StringBuffer appendTail (StringBuffer sb)
Raggiungere le aggiunte e sostituzioni terminali passo.
3 public String replaceAll (sostituzione String)
Modalità Sostituire con la stringa di sostituzione data in base alla sequenza di ingresso per ogni sequenza.
4 public String replaceFirst (sostituzione String)
Modalità Sostituire con la stringa di sostituzione data corrispondente alla sequenza di ingresso del primo sub-sequenza.
5 String quoteReplacement public static (String s)
Restituisce una stringa di sostituzione letterale di stringa. Questo metodo restituisce una stringa che viene passata come un metodo di lavoro di classe appendReplacement Matcher come una stringa letterale.

inizio e fine il metodo

Ecco un esempio del numero di occorrenze nella stringa di input per contare la parola compare "cat":

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());
      }
   }
}

Gli esempi sopra risultati elaborati sono i seguenti:

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

Questo può essere visto utilizzando i confini di parola esempio, per garantire che la lettera "c" "a" "t" non è solo una lunga sottostringhe parola. Esso fornisce inoltre alcune informazioni utili riguardo la stringa di input è abbinato posizioni.

metodo start restituisce l'operazione durante la partita precedente, dall'indice dato gruppo catturato sottosequenza iniziale, finisce il metodo di abbinare l'ultimo indice più uno carattere.

sue partite e metodo lookingat

sue partite e dei metodi lookingat sono utilizzati per cercare di abbinare una sequenza di pattern di input. Sono diversi dai requisiti di tutta la partita la sequenza Matcher, ma non lookingat necessaria.

Questi due metodi sono spesso utilizzati in inizia stringa di input.

Attraverso il seguente esempio per spiegare questa caratteristica:

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());
   }
}

Gli esempi sopra risultati elaborati sono i seguenti:

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

metodi replaceFirst e replaceAll

Metodo replaceFirst e replaceAll utilizzato per sostituire il testo corrispondente espressione regolare. La differenza è, replaceFirst sostituire la prima partita, ReplaceAll sostituire tutte le partite.

Il seguente esempio per spiegare questa caratteristica:

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);
   }
}

Gli esempi sopra risultati elaborati sono i seguenti:

The cat says meow. All cats say meow.

metodi appendReplacement e appendTail

classe Matcher fornisce anche un metodo per appendTail appendReplacement e sostituire il testo:

Guardate il seguente esempio per spiegare questa caratteristica:

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());
   }
}

Gli esempi sopra risultati elaborati sono i seguenti:

-foo-foo-foo-

metodi di classe PatternSyntaxException

PatternSyntaxException è una classe di eccezione non obbligatorio, il che indica un normale errori di sintassi del modello di espressione.

Classe PatternSyntaxException fornisce i seguenti metodi per aiutarci a vedere che cosa è verificato un errore.

No. Metodo e Descrizione
1 public String getDescription ()
Ottenere descrizione dell'errore.
2 public int getIndex ()
Ottenere l'indice sbagliata.
3 public String getPattern ()
Prendi il modello di espressione regolare erronea.
4 public String getMessage ()
Restituisce una stringa multi-riga contenente la descrizione di un errore di sintassi e il suo indice, una indicazione visiva del modello di espressione regolare erronea, e l'indice di errore.