2017-03-06 3 views
0

Meine CPP-Anwendung versucht, eine Zeichenfolge mit Mustern zu analysieren:Regulärer Ausdruck, verloren Ergebnisgruppe

^\/color(set| update)? (#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})|([a-zA-Z]{1,20})$ 

Testlauf

/Farbe gesetzt #ffffff - get 2 Gruppen ('gesetzt und' #ffffff ')

/Farbe rot gesetzt - 1 Gruppe mit' rot 'erhalten, was ist mit der Gruppe' set 'passiert? enter image description here

+0

Und Ihre Frage ist? – NathanOliver

+0

@NathanOliver "Was ist mit der Gruppe passiert mit 'set'?" – danilabagroff

+0

@NathanOliver die Operation ** set ** wird nicht im zweiten Beispiel erfasst, wo Farbnamen anstelle von Hex-Werten verwendet werden – mike

Antwort

2

Das Problem ist, Sie haben eine falsche/unnötige Gruppierung. Verwenden Sie die folgenden Schritte aus:

^\/color\s(set|update)?\s?(#[A-Fa-f0-9]{6}|#[A-Fa-f0-9]{3}|[a-zA-Z]{1,20})$ 

DEMO

+0

Danke. Ich werde dies als Antwort akzeptieren, aber Ihr Muster scheitert gegen/Farbe rot (wenn nur ein Leerzeichen dazwischen liegt), deshalb platziere ich Platz in einer Ergebnisgruppe – danilabagroff

+0

Das Problem ist mit '\ s (set | update)? \ S'. Es muss '(?: \ S (set | update))?' –

+0

@ danilabagroff muss den Raum optional machen. check edit – m87

1

Ihr Problem mit diesem Abschnitt der Regex ist.

(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})|([a-zA-Z]{1,20}) 

Mit der Art und Weise Sie sie und der Vorrang des OR-Operator gruppiert haben, wird es grundsätzlich als Fänger ausgewertet werden, wenn eine dieser beiden reguläre Ausdrücke erfüllt sind:

^\/color(set| update)? (#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}) 
([a-zA-Z]{1,20})$ 

Wegen der Zeichenfolge "/color set red "stimmt nicht mit der hexadezimalen Prüfung überein, bestimmt, dass die linke Seite falsch und nur die rechte wahr ist. Daher, warum es das Recht erfasst.

Ich schlage vor, Ihre Regex als dies neu zu schreiben. Auf diese Weise werden ein oder mehrere Leerzeichen und Tabulatorzeichen zwischen den einzelnen Argumenten in der Zeichenfolge berücksichtigt.

^\/color[ \t]*(set|update)?[ \t]+(\#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[a-zA-Z]{1,20})$ 
1

Ich habe benannten Gruppen hinzugefügt und fixiert ein Problem mit der zweiten Whitespaces, die zu /color red führen nicht abgestimmt ist, im Falle des Betriebs entfällt.

^\/color\s+(?<op>set|update)?\s*(?<color>#[AFaf09]{6}|[A-Fa-f0-9]{3}|[a-zA-Z]{1,20})\s*$

Click here die Regex zu testen. Außerdem finden Sie unten eine Version ohne benannte Captures, da SebastianRedl darauf hinweist, dass C++ diese Funktion nicht unterstützt.

^\/color\s+(set|update)?\s*(#[AFaf09]{6}|[A-Fa-f0-9]{3}|[a-zA-Z]{1,20})\s*$

+1

C++ regex unterstützt keine benannten Captures. –

+0

@SebastianRedl Okay, ich werde eine andere Version hinzufügen. – mike