2010-09-21 15 views
43

Questa potrebbe non essere la domanda che ti aspetti! Non voglio una regex che corrisponda alle interruzioni di riga; invece, voglio scrivere una regex lunga che, per leggibilità, mi piacerebbe dividere su più righe di codice.Split Ruby regex su più righe

Qualcosa di simile:

"bar" =~ /(foo| 
      bar)/ # Doesn't work! 
# => nil. Would like => 0 

si può fare?

risposta

37

È necessario utilizzare il modificatore /x, che abilita free-spacing mode.

+24

Questa risposta potrebbe essere migliorata sostituendo il legame con una spiegazione più dettagliata. – mkataja

2

è possibile utilizzare:

"bar" =~ /(?x)foo| 
     bar/ 
+6

Questa risposta è stata utile per la mia situazione, ma solo dopo aver cercato cosa significasse (? X) ed essere stato in grado di aggiungere più contesto. Sarei gentile se questa risposta fosse aggiornata per essere più esplicito su ciò che sta illustrando. Per gli altri interessati, ho trovato le note sul costrutto (? On-off) qui utile: http://ruby-doc.org/core-1.9.3/Regexp.html#class-Regexp-label-Options –

+0

@BenParizek Forse potresti aggiungere una breve spiegazione qui come commento? –

+0

Non sono esperto in questo argomento ma, a quanto ho capito, la maggior parte delle risposte qui stanno dicendo versioni diverse della stessa cosa. Il problema è che le regex complesse sono difficili da leggere. La risposta generica è: puoi abilitare la modalità di spaziatura libera per rendere più leggibili le regex. Esistono vari modi per abilitare la modalità di spaziatura libera. 1) Puoi aggiungere il modificatore dopo il delimitatore finale '/ myregex/x', 2) puoi attivare la modalità di spaziatura libera lungo il percorso usando il costrutto' 'on-off ''/myregex (? X) con spaziatura libera/', 3) puoi usare la sintassi'% r {myregex} x'. –

78

Utilizzando% r con l'opzione x è il modo preferito per fare questo.

Vedi questo esempio dalla guida github rubino stile

regexp = %r{ 
    start   # some text 
    \s   # white space char 
    (group)  # first group 
    (?:alt1|alt2) # some alternation 
    end 
}x 

https://github.com/styleguide/ruby

+2

L'esempio da seguire. I commenti all'interno della regex fanno miracoli sulla manutenibilità. –

+3

Oppure con/anziché% r, perché rubocop si lamenta se una espressione regolare non è tra le barre. Anche la loro guida di stile che la consiglia in questo modo: https://github.com/bbatsov/ruby-style-guide#regular-expressions – ytg