2017-12-30 24 views
-2

Ich habe absolut keine Ahnung, wie man mit Regex arbeitet. Ich bin weniger als ein Anfänger.Wie kann ich diesen Ausdruck negieren

Ich möchte jeden ungültigen CSS-Namen aus einer Zeichenfolge finden, damit ich sie ausschließen kann. Suche Online fand ich einen Weg, um die gültigen Namen wählen mit diesem:

/-?[_a-zA-Z]+[_a-zA-Z0-9-]*/g 

Was ich will ist negate dieser Ausdruck tun, so dass nur ‚1999‘ in diesem Beispiel Eingang abgestimmt ist:

holding-page single 1999 contact id-12 contact single single 
+1

Ich rollte Ihre Bearbeitung zurück, weil es Details Ihrer Qual hinzugefügt hat, aber nichts relevant für die eigentliche Frage. Diese Version hält es einfach, aber alles muss klar und beantwortbar sein. Bitte verzichten Sie auf weitere Änderungen, es sei denn, Sie sind sicher, dass sie einen Mehrwert schaffen. – Bohemian

Antwort

2

To "negieren" einen Ausdruck, macht es zu einem negativen Vorgriff:

/(?<!\S)(?!-?[_a-zA-Z]+[_a-zA-Z0-9-]*)\S+(?!\S)/g 

Siehe live demo.

Was dies tut, ist eine vollständige Bezeichnung, aber eine, die nicht entspricht Ihrem positiven Regex.

A „complete Begriff“ verwendet (?<!\S)\S+(?!\S) abgestimmt, die \S+ (ein oder mehr nicht-Leerzeichen) in negativer Optik arounds für keine nicht-Leerzeichen Teil gewickelt ist ein Begriff zu verhindern entsprechen.
Beachten Sie, dass "kein Nicht-Whitespace" nicht das gleiche wie "Leerzeichen" ist, da "kein Nicht-Whitespace" auch den Anfang und das Ende der Eingabe übereinstimmt, so dass führende und nachfolgende Begriffe, die ungültig sind, übereinstimmen auch.

Ihr positiver Regex wurde durch Einschließen in (?!...) in einen negativen Look umgewandelt.

+0

Danke Bohemian. Ich schätze die ausführliche Erklärung auch. Ich bin überrascht, dass der Prozess, ihn in einen zuverlässigen "negativen Blick nach vorne" zu verwandeln, so viel mehr Arbeit erfordert (mehr als ich erwartet hatte). Das hat mich fasziniert, damit herumzuspielen und zu sehen, was es sonst noch kann. Danke noch einmal. –

Verwandte Themen