【问题标题】:Check if array element appears on line检查数组元素是否出现在线
【发布时间】:2012-09-02 21:49:27
【问题描述】:

我正在逐行浏览一个文件,我想检查该行是否包含数组中的任何元素。例如,如果我有:

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,因为“狗”在数组中。不是“小狗”

我的错误解释不充分

【问题讨论】:

标签: ruby arrays string contains


【解决方案1】:
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

【讨论】:

  • 我想我之前尝试过这个并遇到了这个问题——我想匹配确切的单词。所以,如果我的台词说“我爱我的宠物狗”,这难道不是真的吗?关于如何修改它以获得完全匹配的任何想法?
  • @JaronBradley 你没有在你的问题中提到这一点。您应该更新它以包含该更改,因为该更改会使此处的每个答案都无效。
【解决方案2】:

您必须分别检查数组中的每个字符串,并使用\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可以防止正则表达式中有意义的字符产生意想不到的效果。

【讨论】:

    【解决方案3】:
    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}
    }
    

    代码未测试

    【讨论】:

      【解决方案4】:

      您可以使用您的数组创建一个正则表达式

      myArray = ["cat", "dog", "fish"]
      File.open('file.txt').each_line { |line|
        puts "Found a line containing array string" if %r(#{myArray.join('|')}) === line
      }
      

      【讨论】:

        猜你喜欢
        • 2020-12-03
        • 1970-01-01
        • 2021-10-20
        • 2015-09-02
        • 1970-01-01
        • 2016-10-13
        • 1970-01-01
        • 2018-05-15
        • 1970-01-01
        相关资源
        最近更新 更多