簡體   English   中英

在正則表達式匹配項附近顯示字符

[英]Display characters around regex match

是否可以在正則表達式匹配項附近顯示字符? 我有下面的字符串,我想替換每次出現的"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

如果您想獲得Perl風格的骯臟:

before_chars = $`[-3, 3]

這是模式匹配之前的最后三個字符。

您可能會使用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}將使您能夠打印出易於理解的提示。

備選方案:使用$ 1匹配變量

塔德曼的答案使用特殊的預匹配變量( $` )。 Ruby還將捕獲組存儲在一個編號變量中,這可能很神奇,但可能更直觀。 例如:

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

但是,無論使用哪種方法,請確保在上一次嘗試的匹配失敗時,顯式檢查匹配變量是否為nil。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM