ruby - 如何在 Ruby 中使用正则表达式将字符串拆分为它包含的单词数组?
问题描述
我正在尝试创建一个正则表达式模式,它将一个字符串拆分为一个基于许多不同模式和约定的单词数组。规则如下:
- 它必须在所有破折号、空格、下划线和句点上拆分字符串。
- 当多个上述字符一起出现时,它只能拆分一次(因此 'the--.quick' 必须拆分为 ['the', 'quick'] 而不是 ['the', '', '', '快的'] )
- 它必须将字符串拆分为新的大写字母,同时将该字母与其对应的单词保持一致('theQuickBrown' 拆分为 ['the', 'quick', 'brown']
- 它必须将多个大写字母组合在一起('LETS_GO' 必须拆分为 ['lets', 'go'],而不是 ['l', 'e', 't', 's', 'g', ' o'])
- 它必须在拆分数组中仅使用小写字母。
如果它工作正常,以下应该是正确的
"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"]
如何更新此方法以满足上述所有规范?
解决方案
您可以稍微更改正则表达式,使其不会在每个大写字母上拆分,而是在每个以大写字母开头的字母序列上拆分。这只涉及[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"]
推荐阅读
- git - 如何“忽略”远程仓库中的文件,以便在更新本地副本时不包含它们?
- arrays - Comparison of two arrays in Lazarus
- pandas - PANDAS:按月对分类变量进行分组、过滤和绘图
- python - 如何制作二维阵列(从帧中获取像素颜色)
- c++11 - C++11 将 lambda 表达式注入类
- python - 为什么 Matplotlib 的 plot_wireframe 二维数组的参数是?
- spring-boot - Swagger 2 UI 如何显示未由 RestController 显式返回的模型
- python - 如何检查flask_sqlalchemy表是否为空
- c++ - linux上的clangd找不到默认标头
- php - 用正则表达式匹配一个没有空格的字符串