2011-11-15 7 views
8

Sto provando a eseguire una semplice stringa sub in Ruby.Sottotitoli di stringhe di ruby ​​senza riferimenti di regex back

Il secondo argomento di sub() è un lungo pezzo di JavaScript miniato che contiene espressioni regolari. I riferimenti posteriori nella regex in questa stringa sembrano influenzare il risultato di sub, perché la stringa sostituita (cioè il primo argomento) appare nella stringa di output.

Esempio:

input = "string <!--tooreplace--> is here" 
output = input.sub("<!--tooreplace-->", "\&") 

Voglio l'output di essere:

"string \& is here" 
Non

:

"string & is here" 

o se fuggire l'espressione regolare

"string <!--tooreplace--> is here" 

Fondamentalmente, voglio un modo per fare un sub di stringa che non ha conseguenze di regex - basta sostituire una semplice stringa.

+0

È possibile creare un piccolo esempio che dimostra il problema? –

+0

Esempio di codice aggiunto. –

risposta

2

Usa virgolette singole e fuggire il backslash:

output = input.sub("<!--tooreplace-->", '\\\&') #=> "string \\& is here" 
6

per evitare di dover capire come sfuggire alla stringa di sostituzione, utilizzare Regex.escape. È utile quando le sostituzioni sono complicate, o affrontarle è un dolore inutile. Anche un piccolo aiutante su String è bello.

input.sub("<!--toreplace-->", Regexp.escape('\&')) 
+2

Questo corregge l'esempio, ma sembra causare problemi altrove. Ad esempio, se cambi il secondo argomento in '\ &, O =/\ s * ([\ s \ + \ ~>]) \ s */g', l'output appare come 'string \ &, O =/\ s \ * \ (\ [\ s \\ ~> \] \) \ s \ */g è qui 'con un sacco di cose extra sfuggite. –

3

È inoltre possibile utilizzare la notazione di blocco per rendere più semplice (in contrapposizione a Regexp.escape):

=> puts input.sub("<!--tooreplace-->") {'\&'} 
string \& is here 
+0

Incredibilmente utile, soprattutto perché si applica ad altri usi (ad esempio, la lettura di un file e l'utilizzo del contenuto del file come stringa per la sostituzione) in cui l'escape non è semplicemente un'opzione. –

0

Ebbene, dal momento '\\&' (vale a dire, \ seguito da &) viene interpretato come una dichiarazione regex speciale, è ovvio che è necessario sfuggire al backslash. In realtà, questo funziona:

>> puts 'abc'.sub 'b', '\\\\&' 
a\&c 

Nota che \\\\& rappresenta la stringa letterale \\&.