2010-01-29 53 views
2

爲Web應用程序編寫全球化模塊,我需要用正則表達式將單詞的所有實例替換爲另一個單詞(翻譯) - 除非 - URL/URI。正則表達式 - 替換除網址/ URI之外的單詞

編輯:我忘了提,我使用Ruby的,所以我不能用「回顧後」

+3

通過單詞替換做翻譯註定要失敗。 – recursive 2010-01-29 15:30:43

+0

我試過用這個: '/((?<=> | ^)[^ <] *)(\ bfoo \ b)([^ <] *(?= <| $))/ i' 但它需要Lookbehind ,Ruby不支持 – 2010-01-29 15:40:32

+0

Ruby 1.9支持倒序。你使用1.8嗎? – 2010-01-29 17:08:20

回答

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 
0

可以probaby使用類似

(?<!://[^ ]*)\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 
0

您是否試過將文本分割爲單詞並迭代單詞?然後,您可以檢查每個單詞,確定它是否是URI,如果不是,則將其翻譯。

相關問題