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"