ruby - 搜索字符串返回多个可变长度 Ruby 正则表达式的所有重叠事件的索引

标签 ruby regex tuples irb

我在交互式 Ruby (IRB) $ irb 中使用以下代码来搜索字符串(即 evidence)并返回元组数组(guilty_term_indexes)。每个元组的第二个元素表示 evidence 字符串中的字符索引,其中已找到 guilty_term(存储在元组的第一个元素中)的第一个字符。

guilty_terms = [/danger/i, /hack/i, /ckdd/i]
regex_guilty_terms = Regexp.union(guilty_terms)
evidence = "hackddangerhackdanger"
guilty_terms_and_indexes = []
evidence.scan(regex_guilty_terms) do |index|
    guilty_term = Regexp.last_match.offset(0)[0]
    guilty_terms_and_indexes << [index, guilty_term]
end
p guilty_terms_and_indexes

期望 guilty_terms_and_indexes 返回: [["hack", 0], ["ckdd", 2], ["danger", 5], ["hack", 11], ["ckdd", 13], ["danger", 15]] 但它返回: [[“黑客”,0],[“危险”,5],[“黑客”,11],[“危险”,15]]

如何获得预期的结果?

系统

$ ruby​​ -v ruby 2.3.1p112(2016-04-26 修订版 54768)[x86_64-darwin15]

最佳答案

比赛不能重叠。改用零长度断言:

guilty_terms = [/danger/i, /hack/i, /ckdd/i]

# the positive lookahead is where the magic happens
regex_guilty_terms = /(?=(#{Regexp.union(guilty_terms)}))/
evidence = "hackddangerhackdanger"

# just a squeezin'
[].tap { |arr| evidence.scan(regex_guilty_terms) { |x| arr << [$1, $~.begin(1)] } }
# => [["hack", 0], ["ckdd", 2], ["danger", 5], ["hack", 11], ["danger", 15]]

位置 13 没有打印出来,因为它实际上不匹配,所以...不确定您如何获得预期结果:)

关于ruby - 搜索字符串返回多个可变长度 Ruby 正则表达式的所有重叠事件的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40120358/

相关文章:

ruby-on-rails - 英雄联盟。请求耗时 100 毫秒,间歇性超时

Ruby on Rails 中的 Mysql2 安装

ruby - 使用Ruby的YouTube搜索查询

java - 如何使用查找/替换正则表达式在 intellij 中的字符串中的每个 Camel 大小写字符后插入 _ 字符?

xml - 从 xml 标签中提取 QString

regex - 使用 Sed 将文本文件中的列右对齐

c++ - 如何在 C++11 (STL) 中创建一个压缩两个元组的函数?

Ruby 到 Actionscript3 字节码

python - Python Pandas 循环中的元组索引有问题吗?

c++ - 迭代和调用元组内的异构函数