2

ファイルを1行ずつ調べていて、その行に配列の要素が含まれているかどうかを確認したいと思います。たとえば、私が持っている場合:

myArray = ["cat", "dog", "fish"]

そして現在の行は言った:

ペットの犬が大好きです

出力は言うでしょう

配列文字列を含む行が見つかりました

これが私が持っているものですが、機能しません。

myArray = ["cat", "dog", "fish"]
File.open('file.txt').each_line { |line|
  puts "Found a line containing array string" if line =~ myArray  #need to fix this logic
}

試しましたがinclude?any?正しく使用しているかどうかわかりません。

更新::私が省略した重要な部分。完全一致が必要です!ですから、正確でない場合、ステートメントがtrueを返さないようにします。たとえば、私の行に「ペットの犬が大好き」と書かれている場合、「犬」が配列に含まれているため、このステートメントはfalseを返すはずです。「犬」ではありません

不十分な説明に関する私の間違い

4

4 に答える 4

3

配列内の各文字列を個別にチェックし、\b単語の境界を一致させるために使用して、単語全体のみを取得するようにする必要があります。

strings = ["cat", "dog", "fish"].map { |s| Regexp.quote(s) }

File.open('file.txt').each_line do |line|
  strings.each do |string|
    puts "Found a line containing array string" if line =~ /\b#{string}\b/
  end
end

または、正規表現を作成します。

strings = ["cat", "dog", "fish"].map { |s| Regexp.quote(s) }
pattern = /\b(#{strings.join('|')})\b/

File.open('file.txt').each_line do |line|
  puts "Found a line containing array string" if line =~ pattern
end

呼び出すRegexp.quoteと、正規表現で意味を持つ文字が予期しない影響を与えるのを防ぐことができます。

于 2012-09-10T02:34:34.627 に答える
1

配列を使用して正規表現を作成できます

myArray = ["cat", "dog", "fish"]
File.open('file.txt').each_line { |line|
  puts "Found a line containing array string" if %r(#{myArray.join('|')}) === line
}
于 2012-09-10T02:37:02.433 に答える
0
arr = ['cat', 'dog', 'fish']

File.open('file.txt').each_line do |line|
  puts 'Found a line containing key word' if arr.any? { |e| line.include? e }
end

部分文字列ではなく単語として検出する場合:

line =~ /(#{e}|.*\s#{e})([\s.,:;-].*|\n)/

また、興味深い解決策があります。

arr = ['cat', 'dog', 'fish']

File.open('file.txt').each_line do |line|
  puts 'Found a line containing array string' if !(line.split(/[\s,.:;-]/) & arr).empty?
end
于 2012-09-10T02:37:40.297 に答える
0
myArray = ["cat", "dog", "fish"]
File.open('file.txt').each_line { |line|
  puts "Found a line containing array string" if myArray.any? { |word| /.*#{word}.*/.match? line}
}

コードはテストされていません

于 2012-09-10T02:41:03.383 に答える