0

次のような文字列があるとします。

w="abc#name,xy.abc=abc"

"abc"1番目と3番目を別の文字列に置き換えたい。私はこのコードを使用しました:

puts w.gsub(/\babc\b/,"replacer");
# => replacer#name,xy.replacer=replacer

2番目"abc"が置き換えられますが、これは私が期待したものではありませんでした. その後、次のパターンに変更しました。

puts w.gsub(/[^\.]\babc\b/,"replacer");
# => abc#name,xy.abcreplacer

最初の"abc"ものは置き換えられません。私は今それを修正する方法がわかりません。

4

3 に答える 3

2

あなたが試すことができます

/\b(?<!\.)abc\b/

しかし、それは否定的な後読みを伴うかなり力ずくのソリューションです。

于 2012-11-22T07:58:10.693 に答える
0

Tass に似ていますが、否定的な先読みを使用します

/\babc\b(?!=)/
于 2012-11-22T08:32:35.293 に答える
0

gsub正規表現を単純化し、 のブロックを取る能力に依存します。

target = 'abc'
replacement = 'foo'
'w="abc#name,xy.abc=abc"'.gsub(/#{ target }#|=#{ target }/) { |s| s.sub(target, replacement) }
=> "w=\"foo#name,xy.abc=foo\""

必要なパターンは単純です。

<target>#
=<target>

それらを見つけて、単純な文字列置換を行います。

このようにすると、すべてのロジックが正規表現にカプセル化されるのではなく、2 つの別個のステップに分割されるため、ロジックが簡素化され、開発時間が短縮され、コードの保守が容易になります。

正規表現は強力なツールですが、場合によっては複雑な空気圧ハンマーが必要ない場合もあります。小型でシンプルな爪ハンマーとドライバーが必要な場合があります。

于 2012-11-22T15:48:45.447 に答える