0

正規表現一致の前後に文字を表示することは可能ですか? "change"以下の文字列があり、一致する前に 3 ~ 5 文字を表示しているときに、出現するすべての文字列を置き換えたいと考えています。

string = "val=change anotherval=change stringhere:change: foo=bar foofoo=barbar"

私がこれまでに持っているもの

while line.match(/change/)
  printf "\n\n Substitute the FIRST change below:\n"
  printf "#{line}\n"

  printf "\n\tSubstitute => "
  substitution = gets.chomp

  line = line.sub(/change/, "#{substitution}")
end
4

3 に答える 3

4

あなたが降りて汚いPerlスタイルをしたいなら:

before_chars = $`[-3, 3]

これは、パターンが一致する直前の最後の3文字です。

于 2013-02-08T20:25:44.920 に答える
0

別の方法:1ドルの一致変数を使用する

tadmanの答えは、特別な事前一致変数($ `)を使用しています。Rubyはまた、キャプチャグループを番号付きの変数に格納します。これはおそらく同じように魔法のようですが、おそらくより直感的です。例えば:

string = "val=change anotherval=change stringhere:change: foo=bar foofoo=barbar"
string.sub(/(.{3})?change/, "\\1#{substitution}")
$1
# => "al="

ただし、どの方法を使用する場合でも、最後に試行した一致が失敗した場合は、一致変数のnilsを明示的に確認してください。

于 2013-02-09T13:58:58.363 に答える
0

gsub!次のように指定されたブロックで使用する可能性があります。

line = "val=change anotherval=change stringhere:change: foo=bar foofoo=barbar"

# line.gsub!(/(?<where>.{0,3})change/) {
line.gsub!(/(?<where>\S+)change/) {

  printf "\n\n Substitute the change around #{Regexp.last_match[:where]} => \n"
  substitution = gets.chomp

  "#{Regexp.last_match[:where]}#{substitution}"
}

puts line

収量:

 Substitute the change around val= => 
111
 Substitute the change around anotherval= => 
222
 Substitute the change around stringhere: => 
333

val=111 anotherval=222 stringhere:333: foo=bar foofoo=barbar

gsub!\S+一致をその場で置き換えますが、コメントアウトする代わりに適切なパターンを使用.{0,3}すると、人間が読めるヒントを出力できます。

于 2013-02-09T09:31:36.977 に答える