Ruby 下模式的正则表达式
我需要一个与此文本匹配的正则表达式:Ruby 下模式的正则表达式,ruby,Ruby,我需要一个与此文本匹配的正则表达式: 894975||0||Lever 2000 Anti-Bacterial Bar Soap ||Health & Spa/Personal Care/Body Care/Soap 我想搜索文本,在两组管道之后,匹配“BarSOAP” 如果单词不符合顺序,那么它就不匹配。 我的正则表达式是: /^(?:\d+\|\|).?\|\|[^|]*?(Bar[^|]*? Soap)/i 当“soap”排在第一,“bar”排在第二位时,这不匹配。首先,将行
894975||0||Lever 2000 Anti-Bacterial Bar Soap ||Health & Spa/Personal Care/Body Care/Soap
我想搜索文本,在两组管道之后,匹配“BarSOAP”
如果单词不符合顺序,那么它就不匹配。
我的正则表达式是:
/^(?:\d+\|\|).?\|\|[^|]*?(Bar[^|]*? Soap)/i
当“soap”排在第一,“bar”排在第二位时,这不匹配。首先,将行拆分为元素:
product = str.split(/\|\|/)[2]
然后,尝试检查它是否包括“bar”和“soap”:
[补充]
如果要使用变量匹配项,请尝试以下操作:
re = match_terms.split(/,/).map { |t| "(?=.*#{Regexp::quote t})" }.join ""
puts "match" if product =~ /#{re}/i
或
示例数据看起来像从数据库提取中看到的标准管道分隔(
“|”
)文件。在输出中,通常会看到带有空值的字段显示为|
与其尝试使用正则表达式来解析它,它通常是通过在管道上拆分来处理的,或者通过将其作为CSV记录处理,并使用管道而不是逗号作为列分隔符。如果您得到一个字段实际包含内容的记录,则在双管道(|
)上拆分将失败
这里有两个不同的样本,展示了我是如何做到这一点的。第一个是将|
拆分为字段
text = '894975||0||Lever 2000 Anti-Bacterial Bar Soap ||Health & Spa/Personal Care/Body Care/Soap'
fields = text.split('|')
字段
此时看起来如下所示:
[
[0] "894975",
[1] "",
[2] "0",
[3] "",
[4] "Lever 2000 Anti-Bacterial Bar Soap ",
[5] "",
[6] "Health & Spa/Personal Care/Body Care/Soap"
]
抓取第五个字段将检索产品:
product = fields[4]
=> "Lever 2000 Anti-Bacterial Bar Soap"
第二种方法是将内容视为带有分隔符的CSV文件:
require 'csv'
text = <<EOT
894975||0||Lever 2000 Anti-Bacterial Bar Soap ||Health & Spa/Personal Care/Body Care/Soap
EOT
CSV.parse(text, :col_sep => '|') do |row|
puts row[4]
end
=> "Lever 2000 Anti-Bacterial Bar Soap"
需要“csv”
text=“Lever 2000抗菌条形肥皂”
使用CSV的优点是可以在文本中找到|
字符,CSV将正确处理对嵌入管道的解码
因为只有一个示例输入行,所以这个解决方案不可能更彻底。但每次我都不会只得到两个单词。.我可能也会得到两个以上。.在这种情况下,我能做什么?/^(?:\d+\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\.*?(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/我在这里用match_术语,我可能会得到两个以上的单词。在下面的评论中,你说你可以得到不同的输入值。我们需要看到更多的例子来帮助您。没有他们,任何回答的尝试都是在黑暗中射击。
product = fields[4]
=> "Lever 2000 Anti-Bacterial Bar Soap"
require 'csv'
text = <<EOT
894975||0||Lever 2000 Anti-Bacterial Bar Soap ||Health & Spa/Personal Care/Body Care/Soap
EOT
CSV.parse(text, :col_sep => '|') do |row|
puts row[4]
end
=> "Lever 2000 Anti-Bacterial Bar Soap"