如何解决如何从一个字符串中的多个正则表达式创建匹配的有序列表?
| 如何从多个不同的Regexp中获取字符串中的匹配项列表,并使这些匹配项按其在字符串中的位置进行相对排序? 该字符串可以包含来自同一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
输出:
[{\"word\"=>\"a_word\"},{\"word\"=>\"another_word\"},{\"number\"=>\"23445\"},{\"number\"=>\"12432423\"},{\"word\"=>\"third_word\"}]
解决方法
您可以使用
Regexp.union
将所有正则表达式转换为一个正则表达式,然后使用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\"}]
为了提高可读性,您可以具有以下内容:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。