2015-09-25 18 views
5

Sto cercando di imparare le regole di evidenziazione/grammatica della sintassi di Atom, che utilizzano pesantemente le espressioni regolari JS e ho trovato un modello sconosciuto nello python grammar file.Significato di punto interrogativo e x in un gruppo di espressioni regolari

Il modello inizia con un (?x) che è una regex non familiare per me. L'ho cercato in un online regex tester, che sembra dire che non è valido. Il mio pensiero iniziale era che rappresentava un paren sinistro facoltativo, ma credo che il paren dovrebbe essere scappato qui.

Questo ha senso solo nella grammatica del coffeescript di Atom, o sto trascurando un significato di regex?

(questo modello appare anche nel file textmate language da cui credo che sia nato Atom).

+0

Javascript non supporta il modificatore di regex dettagliato. –

risposta

2

Se l'espressione regolare viene processato in Python, sarà compilato con il flag 'verbose'.

Da the Python re docs:

(? AiLmsux)

(una o più lettere dal set 'a', 'i', 'L', 'M', 's', 'u', 'x'.) Il gruppo corrisponde alla stringa vuota; le lettere impostano le flag corrispondenti: re.A (corrispondenza solo ASCII), re.I (ignora maiuscolo), re.L (dipendente dalle impostazioni internazionali), re.M (multi-linea), re.S (punto corrisponde a tutti), e re.X (dettagliato), per l'intera espressione regolare. (I flag sono descritti nei Contenuti del modulo.) Ciò è utile se si desidera includere i flag come parte dell'espressione regolare, invece di passare un argomento flag alla funzione re.compile().

+1

Grazie, pensavo stesse usando le espressioni regolari JS, ma guardando oltre sembra che Atom abbia modificato il proprio motore regex, che probabilmente include questa funzionalità. – beardc

1

JavaScript regex engine non supporta VERBOSE modificatore x, né in linea, né uno regolare.

Vedi Free-Spacing: x (except JavaScript) a rexegg.com:

Per impostazione predefinita, qualsiasi spazio in una stringa regex specifica un carattere da abbinare. Nelle lingue in cui è possibile scrivere stringhe regex su più righe, le interruzioni di riga specificano anche i caratteri letterali da abbinare. Perché non puoi inserire spazi per separare gruppi che portano significati diversi (come fai tra frasi e paragrafi quando scrivi in ​​inglese), una regex può diventare difficile da leggere ...

Fortunatamente, molti motori supportano uno libero- spaziatura della modalità che ti consente di aerare la tua espressione regolare. Ad esempio, puoi aggiungere spazi tra i token.

Si può anche vedere che chiama modalità spazi, commento modalità o modalità dettagliata.

Ecco 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

Penso che l'esempio e il riferimento alla documentazione alternativa si aggiungano alla domanda, quindi lo terrei. Il mio grande rammarico stava identificando il flag della modalità dettagliata, quindi entrambe le risposte erano utili in quell'aspetto. Grazie. – beardc