Ruby 如何从字符串中的多个regexp创建有序的匹配列表?

Ruby 如何从字符串中的多个regexp创建有序的匹配列表?,ruby,regex,Ruby,Regex,如何从多个不同的正则表达式中获取字符串中的匹配项列表,并根据它们在字符串中的位置对这些匹配项进行相对排序 该字符串可以包含来自同一Regexp的多个匹配项 根据sepp2k的回答,以下是我实施的解决方案(简化示例): test_data = " a_word another_word 23445 12432423 third_word " regexps = /(?<word>[a-zA-Z_]+)/, /(?<number>[\d]+)/ w

如何从多个不同的正则表达式中获取字符串中的匹配项列表,并根据它们在字符串中的位置对这些匹配项进行相对排序

该字符串可以包含来自同一Regexp的多个匹配项


根据sepp2k的回答,以下是我实施的解决方案(简化示例):

test_data = "
  a_word
  another_word  
  23445
  12432423
  third_word
"

regexps = /(?<word>[a-zA-Z_]+)/, /(?<number>[\d]+)/
words = regexps.map{|re| re.names}.flatten!

matches = []
test_data.scan(Regexp.union(regexps)) do
  words.each do |word|
    m = Regexp.last_match
    matches << {word => m.to_s} if m[word]
  end
end

p matches

您可以使用
Regexp.union
将所有Regexp转换为一个Regexp,然后使用
String#scan
查找所有匹配项。通过
scan
返回的数组将按匹配位置排序。

inject
case
语句执行以下操作时,这看起来非常复杂:

> %w{a_word another_word 23445 12432423 third_word}.inject([]) {|s,v| s << case v when /^[a-zA-Z_]+$/ then {'word' => v} when /^\d+$/ then {'number' => v} end }
=> [{"word"=>"a_word"}, {"word"=>"another_word"}, {"number"=>"23445"}, {"number"=>"12432423"}, {"word"=>"third_word"}]
%w{a_单词另一个_单词23445 12432423第三个_单词}。在/^\d+$/然后{number'=>v}结束时注入([]){s,v}s v}
=>[{“单词”=>“一个单词”},{“单词”=>“另一个单词”},{“数字”=>“23445”},{“数字”=>“12432423”},{“单词”=>“第三个单词”}]
为了便于阅读,您可以使用以下内容:

data = <<EOD
  a_word
  another_word
  23445
  12432423
  third_word
EOD

data.split.inject([]) do |s,v|
  s << case v
  when /^[a-zA-Z_]+$/
    {'word' => v}
  when /^\d+$/
    {'number' => v}
  end
end

data=如果有多个正则表达式匹配同一子字符串或从同一位置开始的不同子字符串,您想怎么办?示例数据和预期输出会很好。位置是指字符串的顺序或索引吗?@sawa:在我的情况下,我想我不会遇到这种边缘情况,但如果发生这种情况,我想是最小的一对。马克·托马斯:谢谢你的邀请。我添加了一个示例,以及我提出的实现。让我知道是否/如何改进此代码。谢谢,这很有帮助。我已经公布了你建议的实施情况。让我知道是否/如何改进此代码。
data = <<EOD
  a_word
  another_word
  23445
  12432423
  third_word
EOD

data.split.inject([]) do |s,v|
  s << case v
  when /^[a-zA-Z_]+$/
    {'word' => v}
  when /^\d+$/
    {'number' => v}
  end
end