2017-11-09 3 views
1

Ich möchte feststellen, ob eine Regex genau mit seinen eigenen Inhalten übereinstimmt. Mein Ziel ist es festzustellen, ob eine beliebige Regex durch einen einfachen String-Vergleich ersetzt werden kann.Wie zu bestimmen, ob Regex ist genau

Zum Beispiel die Regex

^abc123$ 

genau entspricht die Zeichenfolge „abc123“ und sonst nichts, und so konnten wir es mit einem input == "abc123" Vergleichsstring ersetzen.

Diese Regex, auf der anderen Seite, passt an sich, sondern auch viel mehr

^a.*3$ 

Spiele: "a3", "afoo3", "a. * 3". Dies könnte nicht durch einen input =="a.*3" String-Vergleich ersetzt werden.

Was ist der beste Ansatz, um zu bestimmen, ob eine Regex nur einer einzelnen exakten Zeichenfolge entspricht? Gibt es eine vollständige Liste der Steuerzeichen, nach denen ich suchen kann?

+2

einfach: sobald Sie quantifiers haben ('+', '*', '{n, m}') oder Alternativen (Zeichenklassen: '[aeiou]') und/oder Lookarounds (die eine bestimmte Position behaupten), werden String-Vergleiche nicht mehr ausreichen. – Jan

Antwort

2

Die meisten Programmiersprachen, die reguläre Ausdrücke unterstützen, sollten eine Hilfsfunktion haben, um spezielle Regex-Zeichen innerhalb einer Zeichenfolge zu umgehen. Wenden Sie diese Funktion nur auf die Zeichenfolge an und prüfen Sie, ob die maskierte Version mit der ursprünglichen identisch ist (ohne ^...$).

Beispiel in Python:

>>> s = "abc123" 
>>> re.escape(s) == s 
True 
>>> s = "a.*3" 
>>> re.escape(s) == s 
False 
+0

Addendum: Es kann natürlich auch regexes sein, dass _do_ spezielle Regex-Zeichen verwenden und immer noch nur übereinstimmen. Dies könnte tatsächlich eine interessante Variante von Regex-Golfen oder Regex-Quinting sein. –

+0

Das ist brilliant. Die einzige andere Sache, nach der ich suchen musste, waren die Regex-Flags. Zum Beispiel globale ("g") oder case-insensitive ("i") Übereinstimmung. – mark

+0

Tatsächlich gibt es noch einen anderen Vorbehalt: Wenn die Regex Regex-Zeichen enthält, die bereits maskiert wurden, wie zum Beispiel '\\ *', dann werden diese Zeichen _might_ wieder entkernt (zumindest Python tut dies; andere Sprachen/Bibliotheken können es anders handhaben)). Obwohl diese Regex mit (!) Speziellen Regex-Zeichen nur mit sich selbst übereinstimmt, würde sie durch "re.escape" geändert (wieder entkoppelt) werden. –

Verwandte Themen