Maison  >  Article  >  Java  >  Java implémente la correspondance de chaînes (basée sur la régularité)

Java implémente la correspondance de chaînes (basée sur la régularité)

高洛峰
高洛峰original
2017-01-16 11:05:091716parcourir

Il y a une chaîne, comment vérifier s'il contient des caractères y et f ? La manière la plus sombre est :

Programme 1 : Je sais si, pour les instructions et 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);
 }
}

Cela semble intuitif, mais cette méthode est difficile à gérer avec un travail complexe. Par exemple, demandez-vous s'il y a dans un morceau de texte ? Y a-t-il quelque chose ou quelque chose, etc. C'est un sale boulot.

Paquet java.util.regex de Java

Selon l'idée orientée objet, la chaîne que vous souhaitez interroger telle que is, thing ou ting est encapsulée dans un objet, et cet objet est utilisé comme modèle pour faire correspondre un paragraphe de texte devient plus naturel. L'élément utilisé comme modèle est l'expression régulière qui sera discutée ci-dessous. Ignorons la complexité et regardons un exemple : Programme 2 : Je ne comprends pas. Pouvons-nous jeter un oeil d'abord ?

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

Si str correspond à regEx, alors le résultat est vrai, sinon il est faux. Si vous souhaitez ignorer la casse lors de la recherche, vous pouvez écrire :

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

Bien que je ne connaisse pas Pattern (template, pattern ) et les détails du Matcher (matcher), le programme se sent plus à l'aise si vous interrogez d'abord, puis interrogez chose ou ting, il suffit de modifier le modèle de modèle, au lieu de considérer les instructions if et for, ou via. charAt() .

1. Écrivez une chaîne spéciale - une expression régulière telle que a|f.

2. Compilez l'expression régulière dans un modèle : p

3. Utilisez le modèle p pour faire correspondre la chaîne str.

L'idée est claire, voyons maintenant comment Java la gère (les programmeurs Java ne peuvent pas utiliser ces classes avant JDK1.4.

Classe de modèles et recherche

 ①classe finale publique java .util.regex.Pattern est une expression compilée d'une expression régulière. L'instruction suivante créera un objet Pattern et l'attribuera au handle p : Pattern p=Pattern.compile(regEx);

Fait intéressant, le La classe Pattern est une classe finale et son constructeur est privé. Peut-être que quelqu'un vous a dit quelque chose sur les modèles de conception, ou vous pouvez vérifier les informations pertinentes vous-même. La conclusion ici est la suivante : la classe Pattern ne peut pas être héritée et nous ne pouvons pas créer la classe Pattern. via new.Object.

Par conséquent, dans la classe Pattern, deux méthodes statiques surchargées sont fournies, dont la valeur de retour est l'objet Pattern (référence), telles que :

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

<.> Bien sûr, nous pouvons déclarer le handle de la classe Pattern, tel que Pattern p=null

②p.matcher(str) représente un matcher qui utilise le modèle p pour générer une chaîne str, et sa valeur de retour est Une référence à la classe Matcher, pourquoi avons-nous besoin de cette chose ? D'après l'idée naturelle, ne pouvons-nous pas renvoyer une valeur booléenne

Nous pouvons simplement utiliser la méthode suivante :

Copiez le code comme suit :

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

En fait, la méthode sans handle pour fusionner trois instructions. Aucun handle n'est souvent pas une bonne méthode. Regardons d'abord la classe Matcher. Regardons cet étrange

qualificatif d'expression régulière. 🎜> L'expression régulière (Regular Expression) est une chaîne qui génère des chaînes. Par exemple, String regEx="me " ; ici la chaîne me peut générer : me, mee, meee, meeeeeeeeee Attendez, une expression régulière peut générer des chaînes infinies, donc il est impossible (est-ce nécessaire ?) de sortir tout ce qui est produit par l'expression régulière

Considérons l'inverse, pour les chaînes : me, mee , meee, meeeeeeeee, etc., peut-on avoir un langage pour. Les décrire ? De toute évidence, le langage des expressions régulières est ce langage, qui est une description concise et approfondie de certains modèles de chaînes. Nous utilisons des expressions régulières pour la recherche de chaînes, la correspondance, le remplacement de chaînes spécifiées, le fractionnement de chaînes, etc.

La chaîne qui génère la chaîne - l'expression régulière est vraiment un peu compliquée, car nous voulons décrire n'importe quelle chaîne par des caractères ordinaires (tels que les caractères de a à z) et des caractères spéciaux (appelés métacaractères), et être précis. " ab*" —— peut correspondre à a, ab, abb, abbb.... Par conséquent, * signifie que le caractère précédent peut apparaître zéro ou plusieurs fois. Si vous envisagez uniquement de rechercher, utilisez simplement « a » directement. Mais pensez à la situation de remplacement. Question regEx="abb*" Quel est le résultat ?

 ②"ab"——peut correspondre à ab, abb, abbb... Équivalent à "abb*". Question regEx="ou "Quel est le résultat ?

 ③"ou?"——Peut correspondre à o et ou. ? signifie que le caractère précédent peut être zéro ou une fois.

Ces qualificatifs *, ,? représentent commodément le nombre d'occurrences du caractère précédent (sous-chaîne) (nous utilisons {} pour le décrire) : x*, zéro ou plusieurs fois ≡{0,}

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il pourra aider tout le monde à prendre conscience du pouvoir des expressions régulières.

Pour plus d'articles liés à la correspondance de chaînes en Java (basés sur des règles régulières), veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn