Java >> Java tutorial >  >> Java

Java regex

I denne øvelse vil vi diskutere, hvad der er et regulært Java-udtryk, og hvordan man bruger java-substring-regex til mønstermatchning ved hjælp af pattern.matcher sammen med forskellige eksempler. Vi vil også dække forskellige Java-regex-specialtegn, som vi bruger til java-mønstermatches.

Hvad er et regulært udtryk (Java regex)?

Et regulært udtryk er en teknik, som vi bruger til at søge efter bestemte mønstre i en streng. Det kan enten være et enkelt tegn eller en sekvens af tegn. Vi kan bruge java regex til at udføre enhver form for strengsøgning og -erstatningsoperation.

For at bruge det regulære java-udtryk kan vi importere java.util.regex-pakken.

java.util.regex-pakke

Java.util.regex-pakken indeholder 1 grænseflade og 3 klasser som angivet nedenfor:

  • MatchResult-grænseflade
  • Matcher-klasse
  • Mønsterklasse
  • Klasse PatternSyntaxException

Find

Mønsterklasse

Mønsterklassen bruges til at implementere det regulære java-udtryk. Den har en compile()-metode, der accepterer det regulære udtryk som et argument og returnerer et mønsterobjekt, som vi kan bruge til at udføre et mønstermatch.

Nedenfor er de almindeligt anvendte metoder i Pattern-klassen:

Metode Beskrivelse
Matcher matcher(CharSequence input) Opretter en matcher, der matcher inputtet med det givne mønster
Strengmønster() Returnerer et regulært udtryk, hvorfra mønsteret blev kompileret
String[] split(CharSequence input) Opdeler inputsekvensen omkring mønstermatchet
Mønsterkompilering(strengregex) Kompilerer det regulære udtryk som et mønster
boolean matches(String regex, CharSequence input, Kompilerer det regulære udtryk og udfører et mønstermatch.

Kompileringsmetoden har en option flag parameter, der angiver, hvordan man udfører et mønster java match:

  • Mønster.CASE_INSENSITIVE:Ignorerer store og små bogstaver under mønstersøgningen
  • Pattern.LITERAL:Behandler specialtegnene som almindelige tegn under mønstersøgningen
  • Mønster.UNICODE_CASE:Bruges sammen med CASE_INSENSITIVE for at ignorere store og små bogstaver uden for de engelske alfabeter.

Matcher-klasse

Matcher-klassen implementerer MatchResult-grænsefladen og udfører mønstermatch på en sekvens af tegn. Vi kan oprette et Matcher-objekt ved hjælp af matcher-metoden på Pattern-objektet.

Nedenfor er de forskellige metoder, der er til stede i Matcher-klassen:

Metode Beskrivelse
int end() Returnerer forskydningen af ​​det sidste tegn, der matches
boolesk find() Finder den næste efterfølger af inputtet, der matcher mønsteret
boolesk find(int start) Nulstiller matcheren og finder den næste efterfølger af inputtet, der matcher mønsteret startende fra det angivne indeks
String group() Returnerer den input-undersekvens, der matcher udtrykket
int groupCount() Returnerer antallet af indfangende grupper i matcherens mønster
boolean matches() Finder matchen mod mønsteret
Mønstermønster() Returnerer mønsteret fortolket af matcheren
Matcher region(int start, int end) Indstiller grænsen for området for at udføre mønstermatch
String replaceAll(String replacement) Erstatter al den underfølge, der matcher mønsteret med den givne nye streng
Matcher nulstilling() Nulstiller matcheren

Regulære udtryksmønstre

Vi kan kontrollere for enten alfabetiske eller numeriske regulære udtryksmønstre i en inputstreng. Mønsterklassens kompileringsmetode accepterer dette regulære udtryk som den første parameter. De forskellige kombinationer af mønstre eller karakterklasser er nedenfor:

Mønster Beskrivelse
[abc] Finder et tegn fra valgmulighederne i parentesen
[^abc] Finder et tegn, der ikke er mellem valgmulighederne i parentesen
[0-9] Finder et tegn i området 0-9
[a-zA-Z] Finder et tegn mellem a til z i begge tilfælde
[a-g[k-r]] Finder et tegn mellem a til g og k til r (union)
[a-z&&[lmn]] Finder et tegn mellem a til z, der har l,m,n - skæringspunkt
[a-z&&[^de]] Finder et tegn mellem a og z undtagen d og e - subtraktion
[a-z&&[^h-k]] Finder et tegn mellem a og z undtagen i området h og k

Metategn

Vi kan også bruge metategn som en del af de regulære udtryksmønstre, som har en særlig betydning.

Metategn Beskrivelse
| Finder et match til et hvilket som helst af mønstrene adskilt af |
. Finder en enkelt forekomst af ethvert tegn
^ Finder et match i begyndelsen af ​​strengen
$ Finder et match i slutningen af ​​strengen
\d Finder et ciffer
\s Finder et mellemrumstegn
\b Finder et match i enten begyndelsen eller slutningen af ​​ordet
\uxxxx Finder et unicode-tegn specificeret af det hexadecimale tal xxxx
\D Alle ikke-cifre, der svarer til [^0-9]
\S Ethvert ikke-mellemrum, som svarer til [^\s]
\w Ethvert ordtegn, der svarer til [a-zA-Z_0-9]
\W Enhver ikke-ord-tegn, der svarer til [^\w]

Kvantifikatoren

Vi kan bruge kvantifiers til at definere mængden eller antallet af forekomster af det angivne tegn i det regulære udtryksmønster.

Quantifier Beskrivelse
a+ a forekommer en eller flere gange
a* a forekommer nul eller flere gange
a? a forekommer nul eller én gang
a{n} a forekommer n gange
a{n,} a forekommer n eller flere gange
a{m,n} a forekommer mindst m gange, men mindre end n gange

Eksempler på regulære udtryk i Java

Lad os nu se forskellige java regex-eksempler, der demonstrerer forskellige java-mønstre.

Eksempel:Find en streng

Nedenfor er et simpelt eksempel på at finde et java-mønster med strengen "java" i inputteksten. Den bruger java pattern.matcher-metoden til at tjekke efter det nødvendige mønster. Hvis mønsteret findes, returnerer det sandt, ellers returnerer det falsk.

import java.util.regex.*;

public class RegExDemo {

  public static void main(String[] args) {
    Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher("Welcome to Java tutorial");
    
    boolean bfound = m.find();
    if(bfound)
      System.out.println("Pattern found");
    else
      System.out.println("Pattern not found");
  }

}
Pattern found

Eksempel:Forskellige måder at skrive et regulært udtryk på

Der er forskellige måder at skrive regulære udtryksmønstre på i java. Den 1. metode bruger en kombination af Pattern og Matcher klasse med Pattern.matcher metoden og matches metoden i forskellige udsagn. Den anden metode bruger den samme kombination, men i en enkelt sætning, mens den tredje metode kun bruger Pattern.matches til at søge efter det regulære udtryksmønster.

I dette eksempel tjekker vi for mønsteret med det 2. tegn som 'a', og de resterende tegn kan være alle bogstaver.

import java.util.regex.*;
public class RegExDemo2 {

  public static void main(String[] args) {
    Pattern p = Pattern.compile(".a..");
    Matcher m = p.matcher("java");
    System.out.println(m.matches());
    
    boolean b = Pattern.compile(".a..").matcher("java").matches();
    System.out.println(b);
    
    boolean bm = Pattern.matches(".a..", "java");
    System.out.println(bm);

  }

}
true
true
true

Eksempel:Regulært udtryksmønster ved hjælp af . (prik)

Eksemplet nedenfor viser forskellige demonstrationer af brugen af ​​tegnet .(dot) til et regulært udtryk. Det 1. output er sandt, da det matcher input med 2. tegn som i. 2. output er falsk, da det ikke stemmer overens med det givne udtryk, da der ikke er noget 'i' i 2. tegn. Det 3. output er falsk, da der er mere end 3 tegn. De sidste 2 udsagn er sande, da det 1. tegn er "h", og det sidste tegn er "e", og det matcher også antallet af tegnlængder.

import java.util.regex.*;
public class RegExDemo3 {

  public static void main(String[] args) {
    System.out.println(Pattern.matches(".i", "hi"));
    System.out.println(Pattern.matches(".i", "at"));
    System.out.println(Pattern.matches(".a.", "java"));
    System.out.println(Pattern.matches("h.", "hi"));
    System.out.println(Pattern.matches("..e", "bye"));

  }

}
true
false
false
true
true

Eksempel:Tegnklasse for regulært udtryk

I dette eksempel bruger vi tegnene som et regulært udtryksmønster. Hvis mønsteret er til stede i inputstrengen, returnerer det sandt, ellers returnerer det falsk.

import java.util.regex.*;
public class RegExDemo4 {

  public static void main(String[] args) {
    System.out.println(Pattern.matches("[abc]", "bag"));
    System.out.println(Pattern.matches("[abc]", "a"));
    System.out.println(Pattern.matches("[a-c][p-u]", "ar"));
    System.out.println(Pattern.matches(".*come.*", "welcome"));
    System.out.println(Pattern.matches("java", "Java"));
  }

}
false
true
true
true
false

Eksempel:Kvantifier for regulære udtryk

I eksemplet nedenfor bruger vi forskellige kvantifiers som "?", der kontrollerer, om tegnet kun forekommer én gang, "+" kontrollerer, om tegnet forekommer mere end én gang, og "*" kontrollerer, om tegnet forekommer nul eller flere gange.

import java.util.regex.*;
public class RegExDemo5 {

  public static void main(String[] args) {
    System.out.println(Pattern.matches("[lmn]?", "l"));
    System.out.println(Pattern.matches("[lmn]?", "hello"));
    System.out.println(Pattern.matches("[lmn]+", "llmmn"));
    System.out.println(Pattern.matches("[lmn]*", "java"));
    System.out.println(Pattern.matches("[lmn]*", "lln"));
  }

}
true
false
true
false
true

Eksempel:Find flere forekomster ved hjælp af matchermetoden

Eksemplet nedenfor illustrerer de mange forekomster af mønsteret i inputstrengen ved hjælp af Pattern.matcher-metoden. Den viser de steder, hvor tegnet 'a' forekommer i strengen.

import java.util.regex.*;
public class RegExDemo6 {

  public static void main(String[] args) {
    Pattern p = Pattern.compile("a");
    Matcher m = p.matcher("Welcome to java tutorial");
    
    while(m.find()) {
      System.out.println("Occurs at: " + m.start() + " - " + m.end());
    }

  }

}
Occurs at: 12 - 13
Occurs at: 14 - 15
Occurs at: 22 - 23

Eksempel:Grænsematcher

Dette er et af de java-mønstereksempler, der tjekker for grænseoverensstemmelser. Dette er en type Java-regex-specialtegn i søgemønsteret. Det første output er sandt, da mønsteret matcher begyndelsen af ​​strengen, mens det andet er falsk, da det ikke begynder med mønsteret.

import java.util.regex.*;
public class RegExDemo7 {

  public static void main(String[] args) {
    System.out.println(Pattern.matches("^Java$","Java"));
    System.out.println(Pattern.matches("^Java$","Welcome to java"));
    
  }

}
true
false

Eksempel:Regulært udtryk med cifre

Dette eksempel bruger et talmønster i det regulære udtryk. Det tjekker for et match med ethvert ciffer, der følger efter ordet "Java". Derfor er det 1. 2 output sandt, da det indeholder et ciffer, mens det sidste output er falsk, da det ikke indeholder noget ciffer.

import java.util.regex.*;
public class RegExDemo7 {

  public static void main(String[] args) {
    String regex = "Java\\d";
    System.out.println(Pattern.matches(regex, "Java5"));
    System.out.println(Pattern.matches(regex, "Java8"));
    System.out.println(Pattern.matches(regex, "JavaScript"));
    
  }

}
true
true
false

Eksempel:Brug af logiske operatorer i regulært udtryksmønster

Vi kan også bruge logiske operatorer som AND, OR i mønstre. Som standard tager den hensyn til og AND-operator, når vi har mere end ét tegn i det regulære udtryksmønster. For eksempel i nedenstående kode er outputtet sandt, hvis de første 2 tegn er 'c' og 'h'. Derfor er det 1. 2 output sandt, og det sidste output er falsk.

import java.util.regex.*;
public class RegExDemo8 {

  public static void main(String[] args) {
    String regex = "[Cc][h].*";
    String s = "cheque";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(s);
    
    System.out.println(m.matches());
    
    s = "Chart";
    m = p.matcher(s);
    System.out.println(m.matches());

    s = "color";
    m = p.matcher(s);
    System.out.println(m.matches());
  }

}
true
true
false

Vi kan bruge OR-operatoren ved at bruge '|'-symbolet til at tjekke for de matchende mønstre. I dette eksempel er outputtet sandt, hvis inputstrengen indeholder enten teksten "Java" eller "JavaScript".

import java.util.regex.*;
public class RegExDemo8 {

  public static void main(String[] args) {
    
    String regex = ".*Java.*|.*JavaScript.*";
    String s = "Welcome to Java tutorial";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(s);
    System.out.println(m.matches());
    
    s = "JavaScript tutorial";
    m = p.matcher(s);
    System.out.println(m.matches());
    
    s = "C tutorial";
    m = p.matcher(s);
    System.out.println(m.matches());
  }

}
true
true
false

Ovenstående to eksempler illustrerer også brugen af ​​java understreng regex i mønstersøgning, da vi tjekker for en understreng i inputstrengen.

Konklusion

I dette selvstudium har vi lært Java regulært udtryksmønstermatchning ved hjælp af Pattern.matcher og andre metoder med eksempler sammen med, hvordan man bruger Java regex specialtegn og java substring regex i mønstersøgning.


Java tag