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

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

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

  • 拆分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 = < LINKED-LIST http://www.stackoverflow.com LINKED-LIST # => LINKED-LIST http://www.somewhere.come/stack?stack=stack#stack LINKED-LIST 

你可以使用类似的东西

 (? 

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

 PS Home:\> "foo foobar http://foo_bar/baz?gak=foobar baz foo" -replace '(? 

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