在字符串中查找正则表达式匹配的索引

时间:2017-10-04 17:32:11

标签: ruby

在获得匹配时是否可以在正则表达式中找到匹配的索引?例如:

str = "foo [bar] hello [world]"
str.match(/\[(.*?)\]/) { |match,idx| 
  puts match
  puts idx
}

不幸的是,idx在这个例子中是零。

我的真实世界问题是一个字符串,我想根据某些条件(例如,如果字符串在黑名单中),例如,用括号括起括号括号中的某些子字符串。当"foo [bar] hello [world]"一词列入黑名单时,"foo [bar] hello (world)"应成为world

2 个答案:

答案 0 :(得分:2)

您可以使用String#gsub

blacklist = ["world"]
str = "foo [bar] hello [world]"

str.gsub(/\[(\w*?)\]/) { |m|
  blacklist.include?($1) ? "(#{$1})" : m
}

#=> "foo [bar] hello (world)"

答案 1 :(得分:1)

如果您想要一个包含每个匹配对象的枚举器,您可以使用:

def matches(string, regex)
  position = 0
  Enumerator.new do |yielder|
    while match = regex.match(string, position)
      yielder << match
      position = match.end(0)
    end
  end
end

举个例子:

p matches("foo [bar] hello [world]", /\[(.*?)\]/).to_a
# [#<MatchData "[bar]" 1:"bar">, #<MatchData "[world]" 1:"world">]
p matches("foo [bar] hello [world]", /\[(.*?)\]/).map{|m| [m[1], m.begin(0)]}
# [["bar", 4], ["world", 16]]

您可以从匹配对象中获取匹配的字符串及其索引。

但实际上,看起来你需要gsub一个块:

"foo [bar] hello [world]".gsub(/\[(.*?)\]/){ |m| # define logic here }