2016-06-09 20 views
1

Ich versuche, die folgenden Werte übereinstimmen, die wiederholen und voran mit : und es gelang ihm mit ;:Regex Matching erneuten Auftretens gleichen wörtlichen

border-radius:5px; 
border-radius:4px 4px; 
border-radius:8px 8px 8px; 
border-radius:5px 5px 5px 5px; 

Der passende Muster sollte die folgenden nicht überein:

border-radius:5px 0px; 
border-radius:5px 0px 10px; 
border-radius:5px 10px 8px 2px; 

Bisher weiß ich, wie alles passen, bevor ':' und nach ';':

(?<=:)(.+px)((?=;)|) 

Auch ich bin passende spezifische Literale auf diese Weise:

((5px)(\s)*){1,4} 

Aber ich möchte eine wörtliche entsprechen zu können und dann sehen, ob die exakt gleiche wörtlichen Wiederholungen 0 bis 3-mal mit Leerzeichen getrennt und beendet mit einem Semikolon.

Ich bin auf der Suche nach etwas wie: "Wenn der erste Wert 5px ist, dann überprüfen Sie, ob die folgenden Werte auch 5px sind, bis ein Semikolon auftritt."

+0

Was ist Ihr Regex-Geschmack? – anubhava

+0

Ich verwende die pcre-Engine, um mein Muster bei regex101.com zu erstellen. Ich werde später Sublime Text verwenden, um durch eine CSS-Datei zu gehen, aber das ist egal. Wenn es aus irgendeinem Grund in einer Engine passt und nicht in einer anderen Engine, werde ich nach einer Möglichkeit suchen, sie an jede Regex-Engine anzupassen, die ich verwende. –

Antwort

1

Sie diese Regex wiederholt verwenden können, um zu validieren:

:(\d+px)(?:\h+\1)*; 

RegEx Demo

Erläuterung: (mit Hilfe von OP)

(?:\h+\1)*; startet eine neue nicht- einfangende Gruppe, \h+ entspricht o ne oder mehrere horizontale Leerzeichen (wie Tabulatoren oder reguläres Leerzeichen), \1 entspricht dem Vorkommen der ersten Erfassungsgruppe, es scheint nur dann zu sein, wenn die Übereinstimmung genau dem Wert der ersten Erfassungsgruppe entspricht (also 5px gewonnen ' t zum Beispiel mit 8px übereinstimmen). Schließlich gibt * an, dass diese Nicht-Capture-Übereinstimmung 0 unendlich oft auftritt (also keine obere Grenze für 4).

+1

Danke, das scheint wie geplant zu funktionieren. Zur Klarstellung (an andere Leser): '(?: \ h + \ 1) *; 'startet eine neue nicht-einfangende Gruppe,' \ h + 'entspricht einem oder mehreren horizontalen Leerzeichen (wie Tabulatoren oder regulärem Leerzeichen),' \ 1' entspricht dem Auftreten der ersten Capture-Gruppe scheint dies nur dann zu tun, wenn die Übereinstimmung genau dem Wert der ersten Erfassungsgruppe entspricht (also passt 5px beispielsweise nicht zu 8px). Schließlich gibt '*' an, dass diese Nicht-Erfassungsanpassung 0 bis unendlich oft vorkommt (also keine Obergrenze für den Wert 4). –

+1

Tolle Erklärung, ich habe es auch in der Antwort hinzugefügt. – anubhava

+1

Hier ist ein modifiziertes Muster, das Lookaround verwendet, das den vorangestellten Doppelpunkt und das nachfolgende Semikolon in der Übereinstimmung nicht einschließt: '(? <=:) (\ D + px) (?: \ H + \ 1) * (? = ;) ' https://regex101.com/r/zN5aX8/2 –

0

Man könnte so etwas wie die folgenden versuchen:

:\s*(\d+)\w*(?:\s+\1\w*)+; 

die Erfassungsgruppe anpassen, je nach Ihren Bedürfnissen.

Regex demo

+0

in Betracht ziehen, es zu ändern: ': \ s * (\ d + px) \ w * (?: \ S + \ 1 \ w *) {0,3};' –

+0

@James Buck: Danke für den Vorschlag, ich denke schon ein Fehler mit Ihrem Muster, (\ d +) würde jedoch ermöglichen, dass unähnliche Werte übereinstimmen. –

+0

@BryceDrew: Danke für Ihre Bearbeitung, aber es stimmt nicht mit allen erforderlichen Mustern überein: https://regex101.com/r/sQ1oH8/1 –