Opérateur AND dans les expressions régulières

J’ai longtemps cherché à utiliser l’opération logique AND dans des expressions régulières en Java et j’ai échoué.
J’ai essayé de faire comme recommandé dans un sujet similaire:

(?=match this expression)(?=match this too)(?=oh, and this) 

et ça ne marche pas. Même des exemples simples avec? = Renvoie false:

 Ssortingng b = "aaadcd"; System.out.println(b.matches("(?=aa.*)")); 

J’ai aussi lu que (expression X)(expression Y) devrait fonctionner comme X AND Y , mais comme X OR Y
Qu’est-ce que je fais mal?

Ajouté: J’ai essayé d’append .* la fin. Ne fonctionne toujours pas.
Pour un exemple:

[2-9]?[0-9]{5,9}||1[2-9][0-9]{1,2}||120[0-9]{1,1}||119[0-9] = X – retourne faux si le nombre est inférieur à 1190

[0-9]{1,3}||1[0-0][0-9]{1,2}||11[0-8][0-9]{1,1}||119[0-2] = Y – renvoie false si le nombre est supérieur à 1992.

 Ssortingng a = "1189"; a.matches(X) // return false a.mathes(Y) // return true a.matches((?=X)(?=Y).*) // return true, but should return false. 

Ajouté: Oui, mon expression rationnelle n’est pas correcte. Ma faute. Le problème résolu. Merci beaucoup à tous!

Je pense que ce dont vous avez besoin est (?=X)Y

  • (?=X) correspond à X, sans le consumr (largeur nulle)
  • Y et correspond à Y

Le problème principal: X et Y sont faux, ils devraient l’être (en supposant 4 chiffres):

X: 119[0-9]|1[2-9][0-9]{2}|[2-9][0-9]{3}

  • 1190-1199, ou
  • 1200-1999, ou
  • 2000-9999

Y: 1[0-8][0-9]{2}|19[0-8][0-9]|199[0-2]

  • 1000-1899, ou
  • 1900-1980, ou
  • 1990-1992

Voici un code de test:

 // X - return false if number is less than 1190 Ssortingng X = "119[0-9]|1[2-9][0-9]{2}|[2-9][0-9]{3}"; // Y - return false if number is greater than 1992. Ssortingng Y = "1[0-8][0-9]{2}|19[0-8][0-9]|199[0-2]"; Ssortingng pattern = "(?=" + X + ")" + Y; Ssortingng values = "1000 1100 1180 1189 1190 1191 1199 1200 1290 1900 1980 1989 " + "1990 1991 1992 1993 1999 2000 3000 2991 9999"; for (Ssortingng ssortingng : values.split(" ")) { System.out.printf("\"%s\" %s%n", ssortingng, ssortingng.matches(pattern)); } 

(?= fonctionne-t-il?

Qu’est-ce que vous faites mal, c’est que vous utilisez des matches mais votre regex ne correspond à rien.

(?= est une perspective positive de largeur zéro : il ne “consum” aucun caractère, mais vérifie simplement que sa position est suivie de quelque chose qui correspond à son contenu.

Donc, remplacez votre appel matches() par Matcher.find() ou assurez-vous que votre regex Matcher.find() quelque chose qui correspond à la chaîne complète ( .* Est un candidat commun).

Comme Joachim a répondu, ajoutez un .* la fin:

 Ssortingng b = "aaadcd"; System.out.println(b.matches("(?=aaa)(?=.*dcd).*")); // => true Ssortingng b = "aaaxxx"; System.out.println(b.matches("(?=aaa)(?=.*dcd).*")); // => false