用gsub替换带有重音的正则表达式

时间:2013-02-21 17:28:52

标签: ruby-on-rails regex

我尝试设置一个函数来设置< b>围绕捕获的字符串(不区分大小写),如下所示:

bold_string("Hello everyone","o")
> "Hell<b>o</b> every<b>o</b>ne"

bold_string("HEllo evEryonE", "e")
> "H<b>E</b>llo <b>e</b>v<b>E</b>ryon<b>E<b/>"

现在,我的功能看起来像这样:

def bold_string(str, search)
  str.gsub(/(#{search})/i, '<b>\1</b>')
end

它与之前的示例完美配合,但与带有一些重音的单词无关。我期待的结果是:

bold_string("Petite bête", "e")
> "P<b>e</b>tit<b>e</b> b<b>ê</b>t<b>e</b>"

bold_string("Petite bête", "ê")
> "P<b>e</b>tit<b>e</b> b<b>ê</b>t<b>e</b>"

换句话说,我必须找到像/ search / i这样的正则表达式,它说“你必须找到'搜索'这个词或'搜索'这个词带有一些重音”。

编辑

我看到我对我的例子过于简单......它应该与字符串一起工作而不仅仅是字符:

bold_string("Petite bête", "êt")
> "P<b>et</b>ite</b> b<b>êt</b>e"

此致

皮尔

edit2: 我使用F.J的解决方案和这个新功能

def regex_from_string_including_accents(str)
  accents = ['aàâ', 'eéèêë', 'oöô' 'iî']
  return str.gsub(/./) do |letter|
    accent_group = accents.detect{|group| group.include?(letter)}
    accent_group ? "[#{accent_group}]" : letter
  end
end

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

def bold_string(str, search)
  h = { "e" => "[eéê]", "a" => "[aáâ]" }
  regex = search.gsub(/./) {|s| h.fetch(s, s)}
  str.gsub(/(#{regex})/i, '<b>\1</b>')
end

显然,这只是告诉你如何开始,你需要用h填充其他重音版字符。

示例:http://ideone.com/KukiKc