mikrocontroller.net

Forum: PC-Programmierung Regex: doppelte Zeichen erkennen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: JavaNeuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
   String quelle="Bla bla ....";
   String pattern= "[A-Z,a-z,0-9-_]";   // <- hier fehlt das Verbot
   
   Pattern p = Pattern.compile(pattern);      
   Matcher m = p.matcher(quelle);  
        
   while (m.find()){
      int start = m.start();         
      int end = m.end();          
      String part = base.substring(start, end);
      System.out.println(part); 
   }


Autor: Heiko L. (zer0)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Milo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

use strict;
use warnings;

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

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


Zur Erklärung des Regex:
([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+)
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

Autor: sid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einen quantifier
"[-_]{2,}"

bedeutet: - oder _ mindestens zwei mal in direkter Folge

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.