如何使用正则表达式提取骆驼大小写字符串的所有单词?

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 始终是默认值。

以上是关于如何使用正则表达式提取骆驼大小写字符串的所有单词?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式,将字符串中的每个单词首字母大写

在js中使用正则表达式从字符串中提取单词

如何提取 MySQL 字符串中的第 n 个单词并计算单词出现次数?

正则表达式用来根据某种匹配模式寻找字符串中的某些单词。

JavaScript 正则表达式 - 从单词旁边提取数字

必须通过剥离符号 ^ 字符的最后一次出现以通过正则表达式提取结束来提取单词的开头