2017-04-13 7 views
1

Für ein Projekt von mir möchte ich "Blöcke" mit Regex erstellen.So erstellen Sie "Blöcke" mit Regex

\xyz\yzx //wrong format 
x\12 //wrong format 
12\x //wrong format 
\x12\x13\x14\x00\xff\xff //correct format 

Wenn Regex101 mit meinem regulären Ausdrücken zu testen, kam ich zu this Ergebnis:

([\\x(0-9A-Fa-f)])/gm 

Dies führt zu einer falschen Ausgabe, weil

12\x 

bekommt immer noch als richtig erkannt string, obwohl die Reihenfolge falsch ist, muss sie in der unten angegebenen Reihenfolge und in keiner anderen Reihenfolge sein.

backslash x 0-9A-Fa-f 0-9A-Fa-f 

Kann jemand erklären, wie das funktioniert und warum es auf diese Weise funktioniert? Danke im Voraus!

+0

Meinen Sie, Sie müssen eine Zeichenfolge validieren, die nur aus diesen Blöcken besteht? Wie ['^ (?: \\ x [0-9A-Fa-f] {2}) + $'] (https://regex101.com/r/ZUIoqF/3)? Oder müssen Sie diese Blöcke in einer längeren Zeichenfolge abgleichen (['\\ x [0-9A-Fa-f] {2}'] (https://regex101.com/r/8pFM79/1))? –

+0

Edit: Ihre zweite Regex funktioniert, können Sie mir erklären, warum es die gesamte Zeichenfolge überprüft, anstatt es nach dem ersten "Finden", wie die erste Regex Sie gebucht gestoppt? –

Antwort

1

Um die \, folloed mit x, gefolgt mit 2 Hex-Zeichen, überall in der Zeichenfolge übereinstimmen, Sie

\\x[0-9A-Fa-f]{2} 

Siehe regex demo

Um sie alle nicht-überlappende entsprechen zu zwingen verwenden müssen Vorkommen, verwenden Sie die spezifischen Modifikatoren (wie /g in JavaScript/Perl) oder bestimmte Funktionen in Ihrer Programmiersprache (Regex.Matches in .NET oder preg_match_all in PHP, etc.).

Die ^(?:\\x[0-9A-Fa-f]{2})+$ Regex validiert eine ganze Zeichenfolge, die aus den oben genannten Mustern besteht. Es passiert aufgrund der ^ (Anfang der Zeichenfolge) und $ (Ende der Zeichenfolge) Anker. Beachten Sie, dass die (?:...)+ eine nicht erfassende Gruppe ist, die in der Zeichenkette 1 oder mehrmals (aufgrund + Quantifizierer) wiederholen kann.

Einige Java demo:

String s = "\\x12\\x13\\x14\\x00\\xff\\xff"; 

// Extract valid blocks 
Pattern pattern = Pattern.compile("\\\\x[0-9A-Fa-f]{2}"); 
Matcher matcher = pattern.matcher(s); 
List<String> res = new ArrayList<>(); 
while (matcher.find()){ 
    res.add(matcher.group(0)); 
} 
System.out.println(res); // => [\x12, \x13, \x14, \x00, \xff, \xff] 

// Check if a string consists of valid "blocks" only 
boolean isValid = s.matches("(?i)(?:\\\\x[a-f0-9]{2})+"); 
System.out.println(isValid); // => true 

Bitte beachte, dass wir [a-zA-Z] zu [a-z] verkürzen können, wenn wir einen Fall unempfindlich Modifikator (?i) zu Beginn des Musters hinzufügen, oder einfach nur \p{Alnum} verwenden, die in einer Java regex beliebige alphanumerische Zeichen Spiele .

Die String#matches Methode immer die Regex standardmäßig verankert, wir brauchen den führenden ^ und Hinter nicht $ Anker, wenn das Muster im Innern verwenden.

+0

Wenn ich dies auf der Website verwende, funktioniert es. Immer wenn ich es in Java einfüge, funktioniert es nicht mehr. Ich benutze die Matches-Funktion ("\\\\ x [0-9A-Fa-f] {2}") eines Strings in Java, aber es sagt mir immer, dass meine Ausgabe falsch ist. Edit: gedrückt Eingabe zu früh –

+0

** Was ist die Eingabezeichenfolge und was ist die erwartete Ausgabe? ** 'String # Matches' Methode erfordert die gesamte Zeichenfolge mit dem Muster, als ob es mit'^'und '$' Anker. –

+0

Siehe auch [diese Demo] (http://ideone.com/zlMKPP), um alle "gültigen" Vorkommen Ihrer "Blöcke" * zu extrahieren. –