Forum: PC-Programmierung Regex: doppelte Zeichen erkennen


von JavaNeuling (Gast)


Lesenswert?

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
   }

von Heiko L. (zer0)


Lesenswert?

1. Schau mal in der Referenz, was die Kommata in der Regexp bedeuten.
2. Man kan in der Regexp beliebig klammern "(a|b)" z.B. findet "a oder 
b". "(a|b)c" findet - was?

Viel Glück!

von Milo (Gast)


Lesenswert?

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

von sid (Gast)


Lesenswert?

einen quantifier
"[-_]{2,}"

bedeutet: - oder _ mindestens zwei mal in direkter Folge

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.