2015-02-20 17 views
19

Solo cercando di eseguire il debug di un'espressione regolare in ruby. Quando mostro il contenuto di un'espressione regolare, mostra ?-mix all'inizio dell'espressione regolare anche se quei caratteri non facevano parte dell'espressione. Si prega di consultare il seguente output IRB per vedere questo illustratoChe cos'è '? -mix' in un'espressione regolare Ruby

irb(main):028:0* EXPR = /^a$/ 
=> /^a$/ 
irb(main):029:0> EXPR 
=> /^a$/ 
irb(main):030:0> puts EXPR 
(?-mix:^a$) 
=> nil 

come si può vedere, quando si utilizza mette di stampare il contenuto di un'espressione regolare, c'è ?-mix all'inizio. Dovrei essere preoccupato da questo? da dove viene?

risposta

26

mix non è la parola inglese mix, è le opzioni di Regexp.

Vedi Regexp#to_s:

restituisce una stringa contenente l'espressione regolare e le sue opzioni (utilizzando il ?opts:source) la notazione (

Nel tuo esempio, m è per la modalità multilinea, i. è per senza distinzione tra maiuscole e minuscole e x è per modalità estesa. Opzioni prima dell'attivazione del trattino, quelle successive sono disattivate (impostazione predefinita). L'esempio della domanda, ?-mix, ha tutte le opzioni disattivate.

È possibile attivare come:

puts /^a$/mix 
# =>(?mix:^a$) 
+0

grande, grazie per quello. Questa opzione potrebbe essere ciò che sta rovinando il mio ex reg. Basta cercare di impostarlo su una singola riga invece – Zephilim

+0

Potrebbe valere la pena notare che '-' disattiva le opzioni * off * (che sono per impostazione predefinita, ma è possibile attivarle e disattivarle per sezioni diverse di un regex, se il tuo gusto regex lo supporta). –

+0

@Shantaram: Sei consapevole del fatto che '(? M)' di Ruby è uguale a ogni altra opzione '(? S)' di flavor regex? Cosa ti aspetti che '^' e '$' corrispondano? –

10

Per quanto riguarda il - è una sintassi per le bandiere. Quelli prima del cruscotto sono accesi, e quelli dopo sono spenti.

Come expalined nel Regexp docs, questo è un modificatore linea, utilizzando il (?on-off) sintassi:

Il delimitatore finale per un regexp può essere seguita da una o più opzioni singola lettera che controllano come il modello può incontro.

  • /pat/i - Ignora caso
  • /pat/m - Trattare un ritorno a capo come un personaggio accompagnato da .
  • /pat/x - Ignora spazi e commenti nel modello
  • /pat/o - Eseguire #{} interpolazione solo una volta

i, m, e x può essere applicato anche a livello sottoespressione con la (?on-off) costrutto, che consente opzioni su, e disabilita opzioni fuori per l'espressione racchiuso dalle parentesi.

Quindi, nel mio caso questo significa che le opzioni m, i e x sono spenti e nessuno sono accese.