2

与えられた-私はRuby 1.8.7を使用しているため、否定的な後読みを使用できません。鬼車も知っていますが、鬼車を使わない解決策を探しています。

私が持っている場合:

foo = "string and string [foo and string stuff] string and strings foostring string"
w = "string"

これを変更するにはどうすればよいですか:

foo.gsub(/\b#{w}\b/i) {|s| "[#{w}]"}

そのため、[] で囲まれた「文字列」は一致しません。たとえば、目的の結果は次のようになります。

"[string] and [string] [foo and string stuff] [string] and strings foostring [string]" 

ありがとう!

4

2 に答える 2

1

あなたが求めていることが単一の正規表現で実行できないことを証明することはできませんが、それが可能であるとは思いません. ただし、これを達成する方法は次のとおりです。

foo = "string and string [foo and string stuff] string and strings foostring string"
w = "string"

brackets = []
a = foo.gsub( /\[[^\]]+\]/ ){ |b| brackets << b; "-^#{brackets.length-1}^-" }
b = a.gsub(/\b#{w}\b/i) {|s| "[#{w}]" }
c = b.gsub( /-\^\d+\^-/ ){ |s| brackets[ s[/\d+/].to_i ] }

p a, b, c
#=> "string and string -^0^- string and strings foostring string"
#=> "[string] and [string] -^0^- [string] and strings foostring [string]"
#=> "[string] and [string] [foo and string stuff] [string] and strings foostring [string]"
于 2010-12-16T18:25:41.480 に答える
1

例のように、角括弧が常にバランスの取れたペアで発生することがわかっている場合は、単語の後の不均衡な閉じ括弧に対して否定先読みを行うことができます。左括弧が単語の後にない場合は、単語の前にある必要があります。例:

foo.gsub(/\b#{w}\b(?![^\[]*\])/) {|s| "[#{w}]"}

別のオプションは、括弧のペアとその中のすべて、またはターゲット文字列のいずれかに一致することです。一致したブラケット シーケンスの場合は、すぐにプラグインします。それ以外の場合は、一致した文字列に角かっこを追加してプラグインます。この場合はさらに簡単です。1 つのグループの角かっこ内のすべてをキャプチャする、別のグループのターゲット文字列をキャプチャしてから、メタシーケンスを使用して内容をプラグインできます。括弧が追加された、一致したグループ。例:\+

foo.gsub(/\[([^\]\[]*)\]|(\b#{w}\b)/, '[\+]')

ideone での動作をご覧ください

于 2010-12-16T20:56:38.977 に答える