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]

这是模式匹配之前的最后三个字符。

于 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="

但是,无论您使用哪种方法,请确保在您上次尝试的匹配失败时明确检查匹配变量的空值。

于 2013-02-09T13:58:58.363 回答
0

您可能会使用gsub!以下方式给出的 with 块:

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 回答