Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Java

Java - Reguliere expressies

Java biedt het pakket java.util.regex voor patroonovereenkomst met reguliere expressies. Java reguliere expressies lijken erg op de programmeertaal Perl en zijn heel gemakkelijk te leren.

Een reguliere expressie is een speciale reeks tekens waarmee u andere tekenreeksen of reeksen tekenreeksen kunt matchen of vinden, met behulp van een gespecialiseerde syntaxis die in een patroon wordt vastgehouden. Ze kunnen worden gebruikt om tekst en gegevens te zoeken, bewerken of manipuleren.

Het pakket java.util.regex bestaat voornamelijk uit de volgende drie klassen −

  • Patroonklasse − Een Pattern-object is een gecompileerde weergave van een reguliere expressie. De klasse Pattern biedt geen openbare constructeurs. Om een ​​patroon te maken, moet u eerst een van zijn openbare statische compile() aanroepen methoden, die dan een Pattern-object zullen retourneren. Deze methoden accepteren een reguliere expressie als het eerste argument.

  • Overeenkomstklasse − Een Matcher-object is de engine die het patroon interpreteert en matchbewerkingen uitvoert op een invoertekenreeks. Net als de klasse Pattern definieert Matcher geen openbare constructeurs. U verkrijgt een Matcher-object door de matcher() . aan te roepen methode op een Pattern-object.

  • PatroonSyntaxException − Een PatternSyntaxException-object is een ongecontroleerde uitzondering die een syntaxisfout in een reguliere-expressiepatroon aangeeft.

Groepen vastleggen

Het vastleggen van groepen is een manier om meerdere karakters als een enkele eenheid te behandelen. Ze worden gemaakt door de tekens die moeten worden gegroepeerd tussen haakjes te plaatsen. De reguliere expressie (dog) creëert bijvoorbeeld een enkele groep met de letters "d", "o" en "g".

Vastleggende groepen worden genummerd door hun openingshaakjes van links naar rechts te tellen. In de uitdrukking ((A)(B(C))), bijvoorbeeld, zijn er vier van dergelijke groepen −

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

Als u wilt weten hoeveel groepen er in de expressie aanwezig zijn, roept u de methode groupCount op een matcher-object aan. De methode groupCount retourneert een int toont het aantal vanggroepen dat aanwezig is in het patroon van de matcher.

Er is ook een speciale groep, groep 0, die altijd de hele uitdrukking vertegenwoordigt. Deze groep is niet opgenomen in het totaal gerapporteerd door groupCount.

Voorbeeld

Het volgende voorbeeld illustreert hoe u een cijferreeks uit de gegeven alfanumerieke reeks kunt vinden −

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

public class RegexMatches {

   public static void main( String args[] ) {
      // String to be scanned to find the pattern.
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      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");
      }
   }
}

Dit levert het volgende resultaat op −

Uitvoer

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

Syntaxis voor reguliere expressies

Hier is de tabel met een lijst van alle syntaxis van metakarakters voor reguliere expressies die beschikbaar zijn in Java −

Subexpressie Komt overeen
^ Komt overeen met het begin van de regel.
$ Komt overeen met het einde van de regel.
. Komt overeen met elk afzonderlijk teken behalve de nieuwe regel. m . gebruiken optie laat het ook overeenkomen met de nieuwe regel.
[...] Komt overeen met elk afzonderlijk teken tussen haakjes.
[^...] Komt overeen met elk afzonderlijk teken dat niet tussen haakjes staat.
\A Begin van de hele string.
\z Einde van de hele string.
\Z Einde van de hele string behalve de toegestane laatste regelterminator.
re* Komt overeen met 0 of meer exemplaren van de voorgaande uitdrukking.
re+ Komt overeen met 1 of meer van het vorige.
re? Komt overeen met 0 of 1 instantie van de voorgaande uitdrukking.
re{ n} Komt overeen met exact n aantal keren dat de voorgaande uitdrukking voorkomt.
re{ n,} Komt overeen met n of meer exemplaren van de voorgaande uitdrukking.
re{ n, m} Komt overeen met ten minste n en maximaal m exemplaren van de voorgaande uitdrukking.
a| b Komt overeen met a of b.
(re) Groepeert reguliere expressies en onthoudt de overeenkomende tekst.
(?:re) Groepeert reguliere expressies zonder de overeenkomende tekst te onthouden.
(?> re) Komt overeen met het onafhankelijke patroon zonder terug te gaan.
\w Komt overeen met de woordtekens.
\W Komt overeen met de niet-woordtekens.
\s Komt overeen met de witruimte. Gelijk aan [\t\n\r\f].
\S Komt overeen met de niet-witruimte.
\d Komt overeen met de cijfers. Gelijk aan [0-9].
\D Komt overeen met de niet-cijfers.
\A Komt overeen met het begin van de tekenreeks.
\Z Komt overeen met het einde van de tekenreeks. Als er een nieuwe regel bestaat, komt deze overeen net voor de nieuwe regel.
\z Komt overeen met het einde van de tekenreeks.
\G Komt overeen met het punt waar de laatste wedstrijd eindigde.
\n Terugverwijzing naar het vastleggen van groepsnummer "n".
\b Komt overeen met de woordgrenzen buiten de haakjes. Komt overeen met de backspace (0x08) binnen de haakjes.
\B Komt overeen met de niet-woordgrenzen.
\n, \t, enz. Komt overeen met nieuwe regels, regelterugloop, tabs, enz.
\Q Escape (citaat) alle tekens tot en met \E.
\E Eindigt citeren begonnen met \Q.

Methoden van de Matcher-klasse

Hier is een lijst met nuttige instantiemethoden −

Indexmethoden

Indexmethoden bieden bruikbare indexwaarden die precies laten zien waar de overeenkomst werd gevonden in de invoerreeks −

Zr.nr. Methode en beschrijving
1

public int start()

Retourneert de startindex van de vorige wedstrijd.

2

public int start(int group)

Retourneert de startindex van de vervolgreeks die door de gegeven groep is vastgelegd tijdens de vorige wedstrijdbewerking.

3

public int end()

Retourneert de offset na het laatste overeenkomende teken.

4

public int end(int group)

Retourneert de offset na het laatste teken van de vervolgreeks die door de gegeven groep is vastgelegd tijdens de vorige wedstrijdbewerking.

Studiemethoden

Studiemethoden beoordelen de invoerreeks en retourneren een Boolean die aangeeft of het patroon al dan niet is gevonden −

Zr.nr. Methode en beschrijving
1

public boolean lookingAt()

Pogingen om de invoervolgorde, beginnend bij het begin van de regio, te matchen met het patroon.

2

public boolean find()

Pogingen om de volgende subreeks van de invoerreeks te vinden die overeenkomt met het patroon.

3

public boolean find(int start)

Stelt deze matcher opnieuw in en probeert vervolgens de volgende subreeks van de invoerreeks te vinden die overeenkomt met het patroon, beginnend bij de opgegeven index.

4

openbare booleaanse overeenkomsten()

Pogingen om de hele regio te matchen met het patroon.

Vervangingsmethoden

Vervangingsmethoden zijn handige methoden om tekst in een invoerreeks te vervangen −

Zr.nr. Methode en beschrijving
1

public Matcher appendReplacement(StringBuffer sb, String vervanging)

Implementeert een niet-terminale stap voor toevoegen en vervangen.

2

public StringBuffer appendTail(StringBuffer sb)

Implementeert een terminal toevoegen-en-vervangen stap.

3

public String ReplaceAll(String vervanging)

Vervangt elke subreeks van de invoerreeks die overeenkomt met het patroon door de gegeven vervangende string.

4

public String ReplaceFirst(String vervanging)

Vervangt de eerste subreeks van de invoerreeks die overeenkomt met het patroon door de gegeven vervangende string.

5

openbare statische String quoteReplacement(String s)

Retourneert een letterlijke vervangende tekenreeks voor de opgegeven tekenreeks. Deze methode produceert een String die zal werken als een letterlijke vervanging s in de appendReplacement-methode van de Matcher-klasse.

De begin- en eindmethoden

Hieronder volgt het voorbeeld dat het aantal keren telt dat het woord "kat" in de invoerreeks voorkomt −

Voorbeeld

Live demo
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);   // get a matcher object
      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());
      }
   }
}

Dit levert het volgende resultaat op −

Uitvoer

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

U kunt zien dat in dit voorbeeld woordgrenzen worden gebruikt om ervoor te zorgen dat de letters "c", "a" "t" niet slechts een subtekenreeks in een langer woord zijn. Het geeft ook wat nuttige informatie over waar in de invoerreeks de overeenkomst heeft plaatsgevonden.

De startmethode retourneert de startindex van de subreeks die door de gegeven groep is vastgelegd tijdens de vorige overeenkomstbewerking, en de end retourneert de index van het laatste overeenkomende teken, plus één.

De overeenkomsten en kijkmethoden

De match- en lookingAt-methoden proberen beide een invoerreeks te matchen met een patroon. Het verschil is echter dat voor overeenkomsten de volledige invoerreeks moet worden gevonden, terwijl lookingAt dat niet doet.

Beide methoden beginnen altijd aan het begin van de invoerreeks. Hier is het voorbeeld waarin de functionaliteit wordt uitgelegd −

Voorbeeld

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

Dit levert het volgende resultaat op −

Uitvoer

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

De methodes ReplaceFirst en ReplaceAll

De methodes ReplaceFirst en ReplaceAll vervangen de tekst die overeenkomt met een bepaalde reguliere expressie. Zoals hun namen aangeven, vervangt ReplaceFirst de eerste instantie, en ReplaceAll vervangt alle instanties.

Hier is het voorbeeld waarin de functionaliteit wordt uitgelegd −

Voorbeeld

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

Dit levert het volgende resultaat op −

Uitvoer

The cat says meow. All cats say meow.

De appendReplacement- en appendTail-methoden

De klasse Matcher biedt ook appendReplacement- en appendTail-methoden voor tekstvervanging.

Hier is het voorbeeld waarin de functionaliteit wordt uitgelegd −

Voorbeeld

Live demo
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);
      
      // get a matcher object
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()) {
         m.appendReplacement(sb, REPLACE);
      }
      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

Dit levert het volgende resultaat op −

Uitvoer

-foo-foo-foo-

PatternSyntaxException-klassemethoden

Een PatternSyntaxException is een ongecontroleerde uitzondering die een syntaxisfout in een reguliere expressiepatroon aangeeft. De klasse PatternSyntaxException biedt de volgende methoden om u te helpen bepalen wat er mis is gegaan −

Zr.nr. Methode en beschrijving
1

public String getDescription()

Haalt de beschrijving van de fout op.

2

public int getIndex()

Haalt de foutenindex op.

3

public String getPattern()

Haalt het foutieve reguliere expressiepatroon op.

4

public String getMessage()

Retourneert een tekenreeks met meerdere regels die de beschrijving van de syntaxisfout en de bijbehorende index, het foutieve reguliere expressiepatroon en een visuele indicatie van de foutindex binnen het patroon bevat.


Java

  1. C#-expressies, statements en blokken (met voorbeelden)
  2. Java-operators
  3. Java-uitdrukkingen, verklaringen en blokken
  4. Java-opmerkingen
  5. Java voor elke lus
  6. Java-strings
  7. Java-interface
  8. Java proberen-met-bronnen
  9. Java-annotaties
  10. Java-beweringen
  11. Java Lambda-expressies