Игнорирование символа вместе с границей слова в регулярном выражении - PullRequest
2 голосов
/ 25 мая 2010

Я использую gsub в Ruby, чтобы сделать слово в тексте жирным. Я использую границу слова, чтобы не делать буквы внутри других слов полужирными, но обнаружил, что это игнорирует слова, которые имеют кавычки после них. Например:

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

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

В этом случае слово ниже не выделено жирным шрифтом. Есть ли способ игнорировать определенные символы вместе с границей слова?

Ответы [ 3 ]

2 голосов
/ 25 мая 2010

Все, что скрывается в Regexp.new, выглядит ужасно. Вы можете значительно упростить это с помощью литерала Regexp:

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

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

Кроме того, вы можете напрямую использовать форму модификатора gsub!, если только эта строка не является псевдонимом в каком-то другом месте вашего кода, который вы нам не показываете. Наконец, если вы используете строковый литерал в одинарных кавычках внутри вызова gsub, вам не нужно экранировать обратную косую черту.

2 голосов
/ 18 ноября 2010

Будьте очень осторожны с вашими \b границами. Вот почему .

0 голосов
/ 25 мая 2010

Синтаксис #{word} не работает для регулярных выражений. Используйте Regexp.new вместо:

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

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

Обратите внимание, что при использовании sting вам нужно экранировать от \b до \\b, или это интерпретируется как возврат. Если word может содержать специальные символы регулярного выражения, экранируйте его, используя Regexp.escape.

Также, заменив строку на <b>#{word}</b>, вы можете изменить регистр строки: «BeloW» будет заменено на «ниже». \0 исправляет это, заменяя найденное слово. Кроме того, я добавил \\b в начале, вы не хотите искать « день » и в конечном итоге «солнце день ».

...