Heim  >  Artikel  >  Java  >  Java implementiert String-Matching (basierend auf Regelmäßigkeit)

Java implementiert String-Matching (basierend auf Regelmäßigkeit)

高洛峰
高洛峰Original
2017-01-16 11:05:091716Durchsuche

Es gibt einen String. Wie kann ich überprüfen, ob er y- und f-Zeichen enthält? Der dunkelste Weg ist:

Programm 1: Ich weiß, ob, für Anweisungen und charAt()

class Test{
 public static void main(String args[]) {
  String str="For my money, the important thing "+"about the meeting was bridge-building";
  char x='y';
  char y='f';
  boolean result=false;
  for(int i=0;i<str.length;i++){
   char z=str.charAt(i); //System.out.println(z);
   if(x==z||y==z) {
    result=true;
    break;
   }
   else result=false;
  }
  System.out.println(result);
 }
}

Es scheint intuitiv, aber diese Methode ist schwer zu handhaben mit komplexer Arbeit. Fragen Sie beispielsweise ab, ob in einem Textabschnitt „ist“ enthalten ist. Gibt es ein Ding oder ein Klingeln usw. Es ist ein scheußlicher Job.

Java's java.util.regex-Paket

Gemäß der objektorientierten Idee wird die Zeichenfolge, die Sie abfragen möchten, z. B. is, thing oder ting, in ein Objekt gekapselt, und dieses Objekt ist es Wird als Vorlage verwendet, um einen Textabsatz abzugleichen, der natürlicher wird. Als Vorlage dient der reguläre Ausdruck, der weiter unten besprochen wird. Ignorieren wir die Komplexität und schauen wir uns ein Beispiel an: Programm 2: Ich verstehe es nicht. Können wir zuerst einen Blick darauf werfen?

import java.util.regex.*;
 
class Regex1{
 public static void main(String args[]) {
  String str="For my money, the important thing "+"about the meeting was bridge-building";
  String regEx="a|f"; //表示a或f
  Pattern p=Pattern.compile(regEx);
  Matcher m=p.matcher(str);
  boolean result=m.find();
  System.out.println(result);
 }
}

Wenn str mit regEx übereinstimmt, ist das Ergebnis wahr, andernfalls ist es falsch. Wenn Sie bei der Suche die Groß- und Kleinschreibung ignorieren möchten, können Sie schreiben:

Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);

Obwohl ich Pattern (template, pattern ) und die Details des Matchers (Matcher), das Programm fühlt sich komfortabler an. Wenn Sie zuerst is abfragen und dann thing oder ting abfragen, müssen wir nur das Vorlagenmuster ändern, anstatt if-Anweisungen und for-Anweisungen oder charAt zu berücksichtigen () .

1. Schreiben Sie eine spezielle Zeichenfolge – einen regulären Ausdruck wie a|f.

2. Kompilieren Sie den regulären Ausdruck in eine Vorlage: p

3. Verwenden Sie Vorlage p, um die Zeichenfolge str abzugleichen.

Die Idee ist klar, jetzt wollen wir sehen, wie Java damit umgeht (Java-Programmierer können diese Klassen erst ab JDK1.4 verwenden.

Musterklasse und Suche

 ①öffentliche Abschlussklasse Java .util.regex.Pattern ist ein kompilierter Ausdruck eines regulären Ausdrucks. Die folgende Anweisung erstellt ein Pattern-Objekt und weist es dem Handle p zu: Pattern p=Pattern.compile(regEx);

Interessanterweise Die Musterklasse ist eine endgültige Klasse und ihr Konstruktor ist privat. Vielleicht hat Ihnen jemand etwas über Entwurfsmuster gesagt, oder Sie können die relevanten Informationen selbst überprüfen. Die Schlussfolgerung hier ist: Die Musterklasse kann nicht vererbt werden und wir können die Musterklasse nicht erstellen durch new. Object.

Daher werden in der Pattern-Klasse zwei überladene statische Methoden bereitgestellt, deren Rückgabewert das Pattern-Objekt (Referenz) ist, wie zum Beispiel:

public static Pattern compile(String regex) {
 return new Pattern(regex, 0);
}

<.> Natürlich können wir das Handle der Pattern-Klasse deklarieren, z. B. Pattern p=null; ②p.matcher(str) bedeutet, dass die Vorlage p verwendet wird, um einen Matcher für die Zeichenfolge str zu generieren , und sein Rückgabewert ist Warum ist dies ein Verweis auf die Matcher-Klasse? Kann es der natürlichen Idee nach nicht einen booleschen Wert zurückgeben?

Wir können einfach die folgende Methode verwenden:

Kopieren Sie den Code wie folgt:

boolean result=Pattern.compile(regEx).matcher(str).find();

Eigentlich ist die Handleless-Methode zum Zusammenführen von drei Anweisungen oft keine gute Methode. Schauen wir uns zuerst diesen seltsamen

Regulärausdruck an Ausdruck ist ein String, der Strings generiert. Beispiel: String regEx="me+"; hier kann der String me+ Folgendes generieren: me, mee, meee, meeeeeeeee Moment, ein regulärer Ausdruck kann unendlich viele Strings generieren, also ist es unmöglich (ist es notwendig). ?), um alles auszugeben, was durch den regulären Ausdruck erzeugt wird

Betrachten Sie den umgekehrten Fall für Zeichenfolgen: mee, meee, meeeeeee usw., können wir offensichtlich eine Sprache haben, um sie zu beschreiben? Ausdruckssprache ist diese Sprache, die eine prägnante und ausführliche Beschreibung einiger Zeichenfolgen darstellt. Wir verwenden reguläre Ausdrücke für die Zeichenfolgensuche, den Abgleich, das Ersetzen spezifizierter Zeichenfolgen, die Zeichenfolgenaufteilung usw.

Die Zeichenfolge, die die Zeichenfolge generiert – der reguläre Ausdruck – ist wirklich etwas kompliziert, da wir jede Zeichenfolge durch gewöhnliche Zeichen (z. B. die Zeichen a bis z) und Sonderzeichen (Metazeichen genannt) beschreiben möchten Seien Sie genau. „ ab*“ – kann mit a, ab, abb, abbb übereinstimmen.... Daher bedeutet *, dass das vorangehende Zeichen null oder mehrmals vorkommen kann. Wenn Sie nur eine Suche in Betracht ziehen, verwenden Sie einfach „a“ direkt. Aber denken Sie an die Ersatzsituation. Frage regEx="abb*" Was ist das Ergebnis?

②"ab+" – kann mit ab, abb, abbb übereinstimmen... Entspricht „abb*“. Was ist das Ergebnis der Frage regEx="or+"?

 ③"or?" – Kann mit o und or übereinstimmen. ? bedeutet, dass das vorangehende Zeichen null oder einmal vorkommen kann.

Diese Qualifizierer *, +, ? stellen praktischerweise die Häufigkeit des Vorkommens des vorhergehenden Zeichens (Teilzeichenfolge) dar (wir verwenden {}, um es zu beschreiben): x*, null oder mehrmals ≡{0,}

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er kann jedem helfen, die Leistungsfähigkeit regulärer Ausdrücke zu erkennen.

Weitere Artikel zum String-Matching in Java (basierend auf regulären Regeln) finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn