2011-06-06 3 views
2

Par exemple:Ruby, la substitution bizarre

str1 = "pppp(m)pppp" 
str2 = "(m)" 
str1 = str1.sub(/#{str2}/, "<>#{str2}<>") 

J'ai ceci:

"pppp(<>(m)<>)pppp" 

Je devrait obtenir ceci:

"pppp<>(m)<>pppp" 

Pourquoi ça se passe et comment l'éviter ?

Répondre

4

Dans ( et ) ont une signification particulière dans regexen et ne correspondent pas réellement les personnages ( et ). L'expression regex /(m)/ correspondra à m qu'elle soit entre parenthèses ou non (et si elle l'est, elle ne correspondra pas aux parenthèses).

Pour correspondre entre parenthèses littérales utiliser \( et \) - ou dans un cas comme celui-ci où vous interpoler une chaîne, vous pouvez simplement utiliser Regexp.escape sur la chaîne, à savoir /#{ Regexp.escape(str2) }/.

1

L'expression régulière est visualisez le "(m)" en tant que groupe de capture parce que les parenthèses sont dans les expressions régulières pour obtenir un "(m)" littéral, vous devez utiliser l'évasion omble \ ["\(m\)"].