2015-09-25 16 views
5

Ich versuche Atom Syntax-Highlighting/Grammatik-Regeln zu lernen, die stark JS regulären Ausdrücken verwenden, und stieß auf ein unbekanntes Muster in der python grammar file.Bedeutung von Fragezeichen und x in einer Regex-Gruppe

Das Muster beginnt mit einer (?x), die eine mir unbekannte Regex ist. Ich habe es in einem online regex tester nachgeschlagen, was zu sagen scheint, dass es ungültig ist. Mein erster Gedanke war, dass es einen optionalen linken Paren darstellt, aber ich glaube, dass der Paren hier entkommen sollte.

Hat das nur Bedeutung in der Coffeescript-Grammatik des Atom, oder übersehe ich eine Regex-Bedeutung?

(Dieses Muster erscheint auch in der textmate language Datei, von der ich glaube Atom stammt).

+0

Javascript unterstützt keine ausführlichen Regex Modifier. –

Antwort

2

Wenn das reguläre Ausdrücke in Python verarbeitet wird, wird es mit dem 'ausführlichen' Flag kompiliert werden.

Von the Python re docs:

(? AiLmsux)

(Ein oder mehr Buchstaben aus dem Satz 'a', 'i', 'L', 'm', 's', 'u', 'x'.) Die Gruppe stimmt mit der leeren Zeichenfolge überein. Die Buchstaben setzen die entsprechenden Flags: re.A (nur ASCII-Übereinstimmung), re.I (Groß-/Kleinschreibung ignorieren), re.L (Gebietsschema abhängig), re.M (mehrzeilig), re.S (dot passt alle), und re.X (ausführlich), für den gesamten regulären Ausdruck. (Die Flags sind in Modul Inhalt beschrieben.) Dies ist nützlich, wenn Sie die Flags als Teil des regulären Ausdrucks enthalten möchten, anstatt ein Flag Argument an die Funktion re.compile() übergeben.

+1

Danke, ich dachte, dass es JS-Regexes verwendet, aber wenn man weiter schaut, sieht es so aus, als ob Atom seine eigene Regex-Engine modifiziert hat, die wahrscheinlich diese Funktion beinhaltet. – beardc

1

JavaScript Regex-Engine unterstützt nicht VERBOSE Modifikator x, weder inline, noch eine regelmäßige.

Siehe Free-Spacing: x (except JavaScript) bei rexegg.com:

Standardmäßig kann jeder Raum in einer Regex Zeichenfolge gibt einen Zeichen angepasst werden. In Sprachen, in denen Sie Regex-Strings in mehreren Zeilen schreiben können, geben die Zeilenumbrüche auch Literalzeichen an, die abgeglichen werden sollen. Da Sie keine Leerzeichen einfügen können, um Gruppen zu trennen, die unterschiedliche Bedeutungen haben (wie Sie zwischen Phrasen und Phragraphen tun, wenn Sie in Englisch schreiben), kann ein Regex schwer lesbar sein ...

Glücklicherweise unterstützen viele Engines ein frei Abstand Modus, mit dem Sie Ihre Regex belüften können. Zum Beispiel können Sie Leerzeichen zwischen den Token hinzufügen.

Sie auch sehen, kann es genannt Leerzeichen Modus, Kommentar Modus oder ausführliche Modus.

Hier ist how it can look like in Python:

import re 
regex = r"""(?x) 
\d+    # Digits 
\D+    # Non-digits up to... 
$     # The end of string 
""" 
print(re.search(regex, "My value: 56%").group(0)) # => 56% 
+1

Ich denke, das Beispiel und alternative Dokumentationsreferenz ergänzen die Frage, also würde ich es behalten. Bei meinem großen Auflegen wurde das ausführliche Modus-Flag erkannt, daher war jede Antwort in diesem Aspekt hilfreich. Vielen Dank. – beardc