2013-07-22 6 views
12

Ich muss eine Regex schreiben, die ein Wort mit einem sich wiederholenden Zeichensatz am Ende identifizieren würde. Gemäß dem folgenden Codefragment ist der sich wiederholende Zeichensatz An. Ich muss einen Regex schreiben, damit dieser entdeckt und angezeigt wird.Schreiben einer Regex zum Erkennen von Wiederholungszeichen

Gemäß dem folgenden Code entspricht \\w einem beliebigen Wortzeichen (einschließlich Ziffer, Buchstabe oder Sonderzeichen). Aber ich möchte nur englische Zeichen identifizieren.

String stringToMatch = "IranAnAn"; 
Pattern p = Pattern.compile("(\\w)\\1+"); 
Matcher m = p.matcher(stringToMatch); 
if (m.find()) 
{ 
    System.out.println("Word contains duplicate characters " + m.group(1)); 
} 

UPDATE

Word contains duplicate characters a 
Word contains duplicate characters a 
Word contains duplicate characters An 
+3

Wie viele Zeichen gilt als "Wiederholung"? Wollen Sie 'Banane' (obwohl es ein gültiges Wort ist) und' Mama' (nur Wiederholungssätze) kennzeichnen. Wie wäre es mit 'Zoo' - Wiederholung eines einzelnen Zeichens - oder' tomtom' (Wiederholung von drei Zeichen). Wenn Sie eine Übereinstimmung von "nur englischen Zeichen" wünschen, verwenden Sie "[A-Za-z]", damit das Zeichen übereinstimmt. – Floris

Antwort

8

Sie wollen so viele Zeichen in Ihrem Set wie möglich zu fangen, so dass anstelle von (\\w) sollten Sie (\\w+) verwenden, und Sie wollen, dass die Sequenz am Ende sein, so müssen Sie hinzuzufügen $ (und ich habe die + nach \\1 entfernt, die nicht sinnvoll ist, um Wiederholungen zu detektieren: nur eine Wiederholung erforderlich ist):

Pattern p = Pattern.compile("(\\w+)\\1$"); 

Ihr Programm gibt dann wie erwartet An aus.

Schließlich, wenn Sie nur ASCII-Zeichen aufnehmen möchten, können Sie [a-zA-Z] statt \\w verwenden:

Pattern p = Pattern.compile("([a-zA-Z]+)\\1$"); 

Und wenn Sie den Zeichensatz wollen mindestens 2 Zeichen sein:

Pattern p = Pattern.compile("([a-zA-Z]{2,})\\1$"); 
+0

Nein, es funktioniert nicht. Ich habe die Ausgabe hinzugefügt, die ich gegeben habe. Es erkennt auch das 'a'. Ich möchte nur aufeinanderfolgende Zeichen erkennen. –

+0

@sharonHwk Ich bin mir nicht sicher, ob ich das verstehe. Ich dachte, mit dem Input "IranAnAn" hättest du erwartet, "An" zu finden - hast du das nicht gemeint? Warum sollte "a" in Ihrem Update als sich wiederholendes Zeichen betrachtet werden? – assylias

+0

Ich möchte nur, dass es ausgibt, wenn es ein wiederholendes "An" erkennt. Es wird jedoch ausgegeben, wenn es ein sich wiederholendes "a" erkennt. –

1

Wenn Sie mit "nur englische Zeichen" AZ und az meinen, funktioniert die folgende Regex:

+0

Nein, es funktioniert nicht. Ich habe die Ausgabe hinzugefügt, die ich gegeben habe. Es erkennt auch das 'a'. Ich möchte nur aufeinanderfolgende Zeichen erkennen. –

+2

In [Unicode-Tabelle] (http://unicode-table.com/en/#0060) zwischen 'A' und' z' gibt es auch andere Zeichen wie '[' '' '' '_' _' ' \ "". '[A-Za-z]' ist genauer. – Pshemo

+0

@Phemo danke für die Eingabe, ich war mir dieses Problems nicht bewusst! –

Verwandte Themen