如何使用正则表达式提取骆驼大小写字符串的所有单词?
Posted
技术标签:
【中文标题】如何使用正则表达式提取骆驼大小写字符串的所有单词?【英文标题】:How to extract all words of a camel cased string with a regular expression? 【发布时间】:2020-03-22 12:05:08 【问题描述】:假设我有一个由多个单词组成的字符串。这些单词没有用空格分隔,但每个单词都以大写字母开头。这种类型的命名约定通常称为“驼峰式”。一些例子:
应用记录 驼峰式 FirstNumberAfterACharacter现在我想将这些字符串拆分为单个单词,例如,FirstNumberAfterACharacter
变为 ["First", "Number", "After", "A", "Character"]
。
找到匹配这些字符串的正则表达式也很容易:^([A-Z][a-z]*)+$
。
但是如果我尝试获取所有匹配项,这个正则表达式只会返回最后一个匹配项:
irb(main):003:0> /^([A-Z][a-z]*)+$/.match('FirstNumberAfterACharacter').captures
=> ["Character"]
irb(main):004:0> 'FirstNumberAfterACharacter'.scan(/^([A-Z][a-z]*)+$/)
=> [["Character"]]
那么我如何获得所有匹配项,而不仅仅是最后一个?
【问题讨论】:
重复捕获组将仅捕获最后一次迭代。如果您知道字符串的格式,则可以匹配所有没有锚点[A-Z][a-z]*
的匹配项。
很遗憾我不知道字数。
我不懂 Ruby,但这是你想要的吗? regex101.com/r/0nZEev/1
@Thefourthbird 是对的,你不必知道字数; scan
负责这一点。 p 'FirstNumberAfterACharacter'.scan(/[A-Z][a-z]*/) # =>["First", "Number", "After", "A", "Character"]
@steenslag:啊啊。谢谢你。这就是我一直在寻找的。span>
【参考方案1】:
我将您的正则表达式更改为:
以包含单个大写字母[A-Z]1
的组(...)
开头,后跟零个或多个大写字母[^A-Z]*
。
'FirstNumberAfterACharacter'.scan(/([A-Z][^A-Z]*)/).flatten(1)
【讨论】:
你可以在[A-Z]
之后省略1
。没有量词 1
始终是默认值。以上是关于如何使用正则表达式提取骆驼大小写字符串的所有单词?的主要内容,如果未能解决你的问题,请参考以下文章