Benötigen Sie einen regulären Ausdruck, um keyword='value' mit einfachen oder doppelten Anführungszeichen zu analysieren
-
12-09-2019 - |
Frage
Ich habe Probleme beim Schreiben eines regulären Ausdrucks (geeignet für preg_match() von PHP), der Schlüsselwort='Wert'-Paare analysiert, unabhängig davon, ob die Zeichenfolge <Wert> in einfache oder doppelte Anführungszeichen gesetzt ist.IOW in beiden folgenden Fällen muss ich den <Name> und den <Wert> abrufen, wobei die Zeichenfolge <Wert> den nicht umschließenden Typ von Anführungszeichen enthalten kann:
name="value"
name='value'
Lösung
In Perl ist dies ein regulärer Ausdruck, der funktionieren würde.Es wurde zuerst nach dem Anfang der Zeile gesucht, dann nach einem oder mehreren Nicht-=-Zeichen und diese wurden auf $1 gesetzt.Als nächstes sucht es nach dem = und dann nach der a-Klammer mit der Auswahl „ oder ' und setzt diese auf $2.
/^([^=]+)=(?:"([^"]+)"|'([^']+)')$/
Wenn Sie möchten, dass es mit leeren Ausdrücken wie folgt übereinstimmt.
Dies=""
Ersetzen Sie die letzten beiden + durch ein *. Andernfalls sollte dies funktionieren
BearbeitenWie in den Kommentaren erwähnt.Doug benutzte...
/^\s?([^=]+)\s?=\s?("([^"]+)"|\'([^\']+)\')\s?/
Dies entspricht einem optionalen Leerzeichen am anderen Ende der Eingabe oder des Werts und er hat die Zeilenendemarkierung entfernt.
Andere Tipps
/^(\w+?)=(['"])(\w+?)\2$/
, die den Schlüssel in $1
und den Wert in $3
platzieren wird.
Ein paar Jahre zu spät, aber da diese Frage sehr auf Google rangiert, und die Antworten, meine Bedürfnisse nicht befriedigen, hier ist eine andere Ausdruck :
(?<key>\w+)\s*=\s*(['"]?)(?<val>(?:(?!\2)[^\\]|\\.|\w)+)\2
Dies wird einfache oder doppelte Anführungszeichen entsprechen, unter Berücksichtigung entkam Anführungszeichen und nicht notierten Werte.
name = bar
name = "bar"
name = 'bar'
name = "\"ba\"r\""
Es wird jedoch die Einschränkung, dass, wenn ein Wert den Schlüssel aus dem nächsten Schlüssel / Wert-Paar fehlt gelesen wird. Dies kann durch die Verwendung eines durch Kommata getrennte Liste von Schlüssel / Wert-Paaren.