0

このテキストに一致する正規表現が必要です。

894975||0||Lever 2000 Anti-Bacterial Bar Soap ||Health & Spa/Personal Care/Body Care/Soap

テキストを検索したいのですが、2セットのパイプの後、「固形せっけん」と一致します。

単語が順番に並んでいない場合は、一致していません。私の正規表現は次のとおりです。

/^(?:\d+\|\|).?\|\|[^|]*?(Bar[^|]*? Soap)/i 

「石鹸」が最初に来て、「バー」が次に来るとき、これは一致しません。

4

2 に答える 2

2

まず、行を要素に分割します。

product = str.split(/\|\|/)[2]

次に、「bar」と「soap」が含まれているかどうかを確認してください。

puts "match" if product =~ /bar/i and product =~ /soap/i
puts "match" if product =~ /bar.*soap|soap.*bar/i
puts "match" if product =~ /(?=.*bar)(?=.*soap)/i

[追加した]

変数match_termsを使用する場合は、次のことを試してください。

re = match_terms.split(/,/).map { |t| "(?=.*#{Regexp::quote t})" }.join ""
puts "match" if product =~ /#{re}/i

また

terms = match_terms.upcase.split(/,/)
puts "match" if terms.select { |t| product.upcase.include? t }.size == terms.size
于 2012-12-08T07:14:35.957 に答える
0

サンプルデータは、データベース抽出から表示される標準のパイプ区切り('|')ファイルのように見えます。||null値のフィールドが出力のように表示されるのはよくあることです。

正規表現を使用して解析しようとするのではなく、通常、パイプで分割するか、列区切り文字としてコンマではなくパイプを使用したCSVレコードとして処理します。||フィールドに実際にコンテンツが含まれているレコードを取得した場合、ダブルパイプ()での分割は失敗します。

これが私がそれを行う方法を示す2つの異なるサンプルです。|1つ目は、フィールドへの分割です。

text = '894975||0||Lever 2000 Anti-Bacterial Bar Soap ||Health & Spa/Personal Care/Body Care/Soap'
fields = text.split('|')

fieldsこの時点で次のようになります。

[
    [0] "894975",
    [1] "",
    [2] "0",
    [3] "",
    [4] "Lever 2000 Anti-Bacterial Bar Soap ",
    [5] "",
    [6] "Health & Spa/Personal Care/Body Care/Soap"
]

5番目のフィールドを取得すると、製品が取得されます。

product = fields[4]
=> "Lever 2000 Anti-Bacterial Bar Soap" 

|これを行う2番目の方法は、コンテンツを区切り文字付きの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を使用してこれを行う利点は、テキスト内の文字を見つけることができることです。CSVは、埋め込まれたパイプのデコードを正しく処理します。

サンプル入力ラインは1つしかないため、このソリューションをこれ以上徹底することはできません。

于 2012-12-08T22:14:00.277 に答える