2010-05-25 5 views
2

J'utilise gsub en Ruby pour faire un mot dans le texte en gras. J'utilise une limite de mots pour ne pas faire de lettres dans d'autres mots en gras, mais je trouve que cela ignore les mots qui ont une citation après eux. Par exemple:Ignorant un caractère avec limite de mot dans regex

text.gsub(/#{word}\b/i, "<b>#{word}</b>") 

text = "I said, 'look out below'" 
word = below 

Dans ce cas, le mot ci-dessous n'est pas mis en gras. Est-il possible d'ignorer certains caractères avec une limite de mot?

Répondre

2

Tout ce qui se échappe dans le Regexp.new cherche assez laid. Vous pouvez simplifier grandement que, en utilisant une expression rationnelle littérale:

word = 'below' 
text = "I said, 'look out below'" 

reg = /\b#{word}\b/i 
text.gsub!(reg, '<b>\0</b>') 

En outre, vous pouvez utiliser directement le formulaire de modification de gsub!, à moins que cette chaîne est aliasé dans un autre endroit dans votre code que vous n'êtes pas nous montrer. Enfin, si vous utilisez le littéral de chaîne simple entre guillemets dans votre appel gsub, vous n'avez pas besoin d'échapper la barre oblique inverse.

0

La syntaxe #{word} ne fonctionne pas pour les expressions régulières. Utilisez Regexp.new à la place:

word = "below" 
text = "I said, 'look out below'" 

reg = Regexp.new("\\b#{word}\\b", true) 
text = text.gsub(reg, "<b>\\0</b>") 

Notez que lorsque vous avez besoin de l'aide de piqûre échapper \b à \\b, ou il est interprété comme un backspace. Si word peut contenir des caractères regex spéciaux, échapper à Regexp.escape.

De plus, en remplaçant la chaîne par <b>#{word}</b>, vous pouvez changer la casse de la chaîne: "BeloW" sera remplacé par "ci-dessous". \0 corrige cela en remplaçant par le mot trouvé. En outre, j'ai ajouté \\b au début, vous ne voulez pas regarder pour « jour » et finissent par « soleil jours ».

+0

C'est un moment de fierté pour moi - mon premier Ruby! J'ai testé le code en utilisant http://www.ruby.ch/interpreter/rubyinterpreter.shtml, et j'ai référé les docs apparemment utiles. – Kobi

+0

Ok merci. Cependant, j'utilise Ruby, et préfère m'en tenir à la méthode gsub. J'utilise # {word} pour passer le mot que j'essaie de mettre en évidence. Donc, dans cet exemple, word = 'below' – DavidP6

Questions connexes