Regex: doppelte Zeichen erkennen

Gast #6019352
Es geht um ein Java-Test/Lernprogramm zum Thema Regex. Dabei sollen in 
einem String bestimmte Zeichen nicht doppelt vorkommen dürfen. In dem 
Beispiel geht es nicht ums Ersetzen (so finde ich nämlich 1000ende 
Beispiele im Web), sondern nur darum, es festzustellen bzw. im Code 
unten NICHT auszugeben.

Es sollen also alle Textstücke aus dem String Quelle ausgegeben werden, 
die Großbuchstaben, Kleinbuchstaben oder Ziffern enthalten. Minus und 
Tiefstrich sind erlaubt, aber nicht direkt hintereinander. Ich weiss 
dass man ein Verbot in der Form ausdrücken kann: ^[abc], aber ich will 
ja doppelte Zeichen verbieten. Wie muss ich das pattern verändern, damit 
bei direkt zusammen auftretenden "--" oder "__" KEIN Treffer erzielt 
wird?
1
   String quelle="Bla bla ....";
2
   String pattern= "[A-Z,a-z,0-9-_]";   // <- hier fehlt das Verbot
3
   
4
   Pattern p = Pattern.compile(pattern);      
5
   Matcher m = p.matcher(quelle);  
6
        
7
   while (m.find()){
8
      int start = m.start();         
9
      int end = m.end();          
10
      String part = base.substring(start, end);
11
      System.out.println(part); 
12
   }
Gast #6019389
Hallo,

wäre es Perl, könnte ich Dir helfen:
1
#!/usr/bin/perl
2

3
use strict;
4
use warnings;
5

6
my $string = "Diieserrrr StrinnGGG enthhaellt doppelte ZZeicheen";
7

8
while( $string =~ m/([a-zA-Z0-9-_])(\1+)/g) {
9
        print "$1 gefolgt von $2...\n";
10
}

Zur Erklärung des Regex:
1
([a-zA-Z0-9-_])
...definiert die Zeichenklasse, die Du grundsätzlich auf Duplikate 
untersuchen willst. Die runden Klammern um diese Zeichenklasse bewirken, 
dass der Treffer referenzierbar... was dann im zweiten Teil geschieht

Das nachfolgende
1
(\1+)
referenziert auf das zuvor gefundene Zeichen \1 und prüft, ob es 
mindestens
einmal folgt (+)...

In der Zeichenkette "abcdef" trifft der Regex also nicht zu. Zwar passen 
die Zeichen auf die definierte Zeichenklasse, der Quantifier passt aber 
nicht...

Die Zeichenkette "aabcdeef" hingegen hat zwei Fälle, in denen auch der 
Quantifier passt.

Diese werden dann ausgegeben.

In Java kann ich es leider nicht, aber ich bin sicher, dass es dort auch 
back-references gibt.



Und das nachfolgende

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.