在获得匹配时是否可以在正则表达式中找到匹配的索引?例如:
str = "foo [bar] hello [world]"
str.match(/\[(.*?)\]/) { |match,idx|
puts match
puts idx
}
不幸的是,idx
在这个例子中是零。
我的真实世界问题是一个字符串,我想根据某些条件(例如,如果字符串在黑名单中),例如,用括号括起括号括号中的某些子字符串。当"foo [bar] hello [world]"
一词列入黑名单时,"foo [bar] hello (world)"
应成为world
。
答案 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 }