首页 > 解决方案 > 如何在 Ruby 中使用正则表达式将字符串拆分为它包含的单词数组?

问题描述

我正在尝试创建一个正则表达式模式,它将一个字符串拆分为一个基于许多不同模式和约定的单词数组。规则如下:

  1. 它必须在所有破折号、空格、下划线和句点上拆分字符串。
  2. 当多个上述字符一起出现时,它只能拆分一次(因此 'the--.quick' 必须拆分为 ['the', 'quick'] 而不是 ['the', '', '', '快的'] )
  3. 它必须将字符串拆分为新的大写字母,同时将该字母与其对应的单词保持一致('theQuickBrown' 拆分为 ['the', 'quick', 'brown']
  4. 它必须将多个大写字母组合在一起('LETS_GO' 必须拆分为 ['lets', 'go'],而不是 ['l', 'e', 't', 's', 'g', ' o'])
  5. 它必须在拆分数组中仅使用小写字母。

如果它工作正常,以下应该是正确的

"theQuick--brown_fox JumpsOver___the.lazy  DOG".split_words == 
["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]

到目前为止,我几乎可以到达那里,唯一的问题是它在每个大写字母上都分裂,所以 "DOG".split_words 是 ["d", "o", "g"] 而不是 ["dog" ]

我还在拆分数组上使用了正则表达式和映射/过滤器的组合来获得解决方案,如果你能告诉我如何摆脱它并只使用正则表达式,则可以加分。

这是我到目前为止所拥有的:

class String
  def split_words 
    split(/[_,\-, ,.]|(?=[A-Z]+)/).
    map(&:downcase).
    reject(&:empty?)
  end 
end

当从上面的测试中调用字符串时返回:

["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "d", "o", "g"]

如何更新此方法以满足上述所有规范?

标签: rubyregex

解决方案


您可以稍微更改正则表达式,使其不会在每个大写字母上拆分,而是在每个以大写字母开头的字母序列上拆分。这只涉及[a-z]+[A-Z]+

string = "theQuick--brown_fox JumpsOver___the.lazy  DOG"
regex = /[_,\-, ,.]|(?=[A-Z]+[a-z]+)/
string.split(regex).reject(&:empty?)
# => ["the", "Quick", "brown", "fox", "Jumps", "Over", "the", "lazy", "DOG"]

推荐阅读