正则表达式 - 替换除URL / URI之外的单词

时间:2010-01-29 15:20:21

标签: ruby regex url replace word

为Web应用程序编写全球化模块,我需要一个正则表达式来将一个单词的所有实例替换为另一个单词(翻译) - 除了 - 在URL / URI中找到的单词。

编辑:我忘了提到我使用Ruby,所以我不能使用'Lookbehind'

3 个答案:

答案 0 :(得分:4)

  • 拆分URI正则表达式;在结果中包含URI。
  • 每件作品:
    • 如果是URI,请不要理会
    • 否则,做单词替换
  • 加入

代码:

# From RFC 3986 Appendix B, with these modifications:
#   o Spaces disallowed
#   o All groups non-matching, except for added outermost group
#   o Not anchored
#   o Scheme required
#   o Authority required
URI_REGEX = %r"((?:(?:[^ :/?#]+):)(?://(?:[^ /?#]*))(?:[^ ?#]*)(?:\?(?:[^ #]*))?(?:#(?:[^ ]*))?)"

def replace_except_uris(text, old, new)
  text.split(URI_REGEX).collect do |s|
    if s =~ URI_REGEX
      s
    else
      s.gsub(old, new)
    end
  end.join
end

text = <<END
stack http://www.stackoverflow.com stack
stack http://www.somewhere.come/stack?stack=stack#stack stack
END

puts replace_except_uris(text, /stack/, 'LINKED-LIST')

# => LINKED-LIST http://www.stackoverflow.com LINKED-LIST
# => LINKED-LIST http://www.somewhere.come/stack?stack=stack#stack LINKED-LIST

答案 1 :(得分:0)

你可以使用像

这样的东西
(?<!://[^ ]*)\bfoo\b

但这可能并不完美,它只是看起来这个单词没有出现在单词前面没有://的单个非空白字符串中。

PS Home:\> "foo foobar http://foo_bar/baz?gak=foobar baz foo" -replace '(?<!://[^ ]*)\bfoo\b', 'FOO'
FOO foobar http://foo_bar/baz?gak=foobar baz FOO

答案 2 :(得分:0)

您是否尝试将文字拆分为单词并迭代单词?然后你可以检查每个单词,确定它是否是一个URI,如果不是则翻译它。