【问题标题】:How to match given characters in string如何匹配字符串中的给定字符
【发布时间】:2016-05-16 22:27:13
【问题描述】:

给定:

fruits = %w[Banana Apple Orange Grape]
chars = 'ep'

如何打印fruits 的所有元素都包含chars 的所有字符?我尝试了以下方法:

fruits.each{|fruit| puts fruit if !(fruit=~/["#{chars}"]/i).nil?)}

但我在结果中看到'Orange',其中没有'p' 字符。

【问题讨论】:

  • 一件小事:!(a =~ <regex>)a !~ <regex>一样。
  • @Trix,我没有看到连接。
  • @CarySwoveland 甚至根本不需要否定。
  • @sawa,我承认没有检查上下文;这是作为一般性评论。

标签: ruby string


【解决方案1】:
chars.each_char.with_object(fruits.dup){|e, a| a.select!{|s| s.include?(e)}}
# => ["Apple", "Grape"]

打印:

puts chars.each_char.with_object(fruits.dup){|e, a| a.select!{|s| s.include?(e)}}

【讨论】:

  • @CarySwoveland 希望你快乐。
  • @NodirNasirov 那又怎样?
【解决方案2】:
p fruits.select { |fruit| chars.delete(fruit.downcase).empty? }
["Apple", "Grape"]

String#delete 返回chars 的副本,其中删除了delete 参数中的所有字符。

【讨论】:

    【解决方案3】:
    fruits = ["Banana", "Apple", "Orange", "Grape"]
    chars = 'ep'.chars
    
    fruits.select { |fruit| (fruit.split('') & chars).length == chars.length }
    
    #=> ["Apple", "Grape"]
    

    【讨论】:

    • 首选'ep'.chars 而不是'ep'.split('')
    • @Jordan 酷豆,我也喜欢。我将编辑我的帖子以反映更改:)
    • @Jordan,你可能还更喜欢chars 而不是'ep'.scan /./
    【解决方案4】:

    我是一个绝对的初学者,但这对我有用

    fruits = %w[Banana Apple Orange Grape] 
    chars = 'ep'
    
    fruits.each {|fruit| puts fruit if fruit.include?('e') && fruit.include?('p')}
    

    【讨论】:

    • 这行得通,但 OP 可能想为任意字符串 chars 这样做。
    • @sawa 明白了。感谢您的澄清。
    • 你可以去掉puts这个词,因为它不需要。
    【解决方案5】:

    只是为了好玩,下面是您可以使用正则表达式执行此操作的方法,这要归功于积极前瞻的魔力:

    fruits = %w[Banana Apple Orange Grape]
    p fruits.grep(/(?=.*e)(?=.*p)/i)
    # => ["Apple", "Grape"]
    

    这很好,简洁,但正则表达式有点神秘,如果你想概括它会变得更糟:

    def match_chars(arr, chars)
      expr_parts = chars.chars.map {|c| "(?=.*#{Regexp.escape(c)})" }
      arr.grep(Regexp.new(expr_parts.join, true))
    end
    
    p match_chars(fruits, "ar")
    # => ["Orange", "Grape"]
    

    另外,我很确定这会被大多数或所有其他答案所超越。

    【讨论】:

    • 非常聪明,很有启发性!
    • 哦哦。我不打算让这成为公认的答案。由于上述原因,它远非理想。 @CarySwoveland 是更好的答案。当我使用电脑时,我可能会将其更改为 Community Wiki。
    【解决方案6】:

    这里还有另一种方法:

    fruits.select {|f| chars.downcase.chars.all? {|c| f.downcase.include?(c)} }
    

    【讨论】:

      【解决方案7】:

      试试这个,首先将所有字符分成一个数组(chars.split("")),然后检查是否所有字符都存在于单词中。

      fruits.select{|fruit| chars.split("").all? {|char| fruit.include?(char)}}
      #=> ["Apple", "Grape"]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-30
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        • 2019-09-08
        • 2014-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多