2010-04-12 5 views
12

Je veux faire correspondre quelque chose comme aaaa, aaaad, adjjjjk. Quelque chose comme ([a-z]) \ 1+ a été utilisé pour faire correspondre les caractères répétés, mais je ne suis pas capable de comprendre cela pour quatre lettres.Regex pour faire correspondre quatre lettres répétées dans une chaîne en utilisant un modèle Java

+0

Hé les gars réponses fraîches mais j'ai une préoccupation « FFFFFFFF » .matches ("([az ]) \\ 1 {3,} ") = true " fffffasdf ".matches (" ([az]) \\ 1 {3,} ") = faux " asdffffffasdf ".matches (" ([az]) \\ 1 {3,} ") = false Que puis-je faire pour les deux derniers? –

Répondre

16

Ne sachant pas sur la syntaxe de répétition finie, votre propre résolution de problèmes de compétences devrait vous conduire à ceci:

([a-z])\1\1\1 

Il est évident que ce n'est pas jolie, mais:

  • Il fonctionne
  • Il exerce votre propre capacité à résoudre des problèmes
  • Cela peut vous mener à une meilleure compréhension des concepts
    • Dans ce cas, connaissant la forme Dessucré de la syntaxe de répétition finie

Hey gars cool réponses mais j'ai une préoccupation

  • "ffffffff".matches("([a-z])\\1{3,}") = true
  • "fffffasdf".matches("([a-z])\\1{3,}") = false
  • "asdffffffasdf".matches("([a-z])\\1{3,}") = false

Que puis-je faire pour les deux derniers?

Le problème est que dans Java, matches doit correspondre à la chaîne entière; c'est comme si le motif était entouré de ^ et $.

Malheureusement il n'y a pas String.containsPattern(String regex), mais vous pouvez toujours utiliser cette astuce d'entourer le motif avec .*:

"asdfffffffffasf".matches(".*([a-z])\\1{3,}.*") // true! 
//       ^^    ^^ 
+0

Si vous essayez de faire correspondre une chaîne où la chaîne que vous recherchez est juste avant un caractère de fin de ligne, le modèle ci-dessus ne correspondra pas. (J'ai appris ça à la dure!). Vous pouvez faire: '"asdfffffffffasf" .matches (". * ([Az]) \\ 1 {3,} (? S). *")' Où '(? S)' déclenche la recherche des caractères de fin de ligne . – seinecle

+0

il est préférable de trouver le caractère répétitif. –

+0

Je recherche cela depuis 2 heures. Merci beaucoup –

21

Vous voulez faire correspondre un seul caractère et ce caractère répété trois fois:

([a-z])\1{3} 

Remarque: Java dont vous avez besoin pour les backslashs dans vos expressions régulières.


Mise à jour: La raison pour laquelle il ne fait pas ce que vous voulez parce que vous utilisez la méthode matches qui exige que la chaîne correspond exactement à l'expression régulière, non seulement qu'il contient l'expression régulière. Pour vérifier l'endiguement, vous devez utiliser la classe Matcher. Voici quelques exemples de code:

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

class Program 
{ 
    public static void main(String[] args) 
    { 
     Pattern pattern = Pattern.compile("([a-z])\\1{3}"); 
     Matcher matcher = pattern.matcher("asdffffffasdf"); 
     System.out.println(matcher.find()); 
    } 
} 

Résultat:

true 
6

Vous pouvez mettre {n} après quelque chose pour le match n fois, donc:

([a-z])\1{3} 
3

Schéma général regex pour la répétition pré-définies est {4}.

Ainsi ici ([a-z]) \ 1 {3} devrait correspondre à vos 4 caractères.

Questions connexes