2

Webアプリケーションのグローバリゼーションモジュールを作成していて、URL / URI内にある単語を除いて、単語のすべてのインスタンスを別の単語(翻訳)に置き換えるためのregexpが必要です。

編集:私はRubyを使用していることを言及するのを忘れたので、「Lookbehind」を使用できません

4

3 に答える 3

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
于 2010-01-31T12:38:55.500 に答える
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
于 2010-01-29T15:26:16.763 に答える
0

テキストを単語に分割して、単語を繰り返し処理してみましたか?次に、各単語を調べて、それがURIであるかどうかを判断し、そうでない場合は翻訳します。

于 2010-01-29T17:11:18.510 に答える