【问题标题】:REGEX to find the first one or two capitalized words in a string正则表达式查找字符串中的前一个或两个大写单词
【发布时间】:2017-04-19 22:29:07
【问题描述】:

我正在寻找一个正则表达式来查找字符串中的第一个或两个大写单词。如果前两个单词大写,我想要前两个单词。连字符应被视为单词的一部分。

  1. Madonna has a new album 我正在寻找madonna
  2. Paul Young has no new album 我正在寻找Paul Young
  3. Emmerson Lake-palmer is not here 我正在寻找Emmerson Lake-palmer

我一直在使用^[A-Z]+.*?\b( [A-Z]+.*?\b){0,1},它在前两个方面效果很好,但对于第三个示例,我得到的是Emmerson Lake,而不是Emmerson Lake-palmer

我可以使用什么 REGEX 来查找上述示例中的第一个或两个大写单词?

【问题讨论】:

  • 是否允许这些单词始终位于输入句子的开头?
  • dotNET,是的……名字总是在开头

标签: regex


【解决方案1】:

你可以使用

^[A-Z][-a-zA-Z]*(?:\s+[A-Z][-a-zA-Z]*)?

regex demo

基本上,使用字符类[-a-zA-Z]*而不是点匹配模式来仅匹配字母和连字符。

详情

  • ^ - 字符串开头
  • [A-Z] - 一个大写的 ASCII 字母
  • [-a-zA-Z]* - 零个或多个 ASCII 字母/连字符
  • (?:\s+[A-Z][-a-zA-Z]*)? - 一个可选的(1 或 0 由于? 量词)序列:
    • \s+ - 1+ 个空格
    • [A-Z] - 一个大写的 ASCII 字母
    • [-a-zA-Z]* - 零个或多个 ASCII 字母/连字符

一个 Unicode 感知等价物(用于支持 Unicode 属性类的正则表达式风格):

^\p{Lu}[-\p{L}]*(?:\s+\p{Lu}[-\p{L}]*)?

其中\p{L} 匹配任何字母,\p{Lu} 匹配任何大写字母。

【讨论】:

  • 我已经添加了模式解释并更新了演示链接。
  • +1 了解详细说明。请注意,您还可以通过指定要排除的字符来使字符类以其他方式工作;例如,[^ ] 将匹配任何非空格。
【解决方案2】:

这可能更简单:

^([A-Z][-A-Za-z]+)(\s[A-Z][-A-Za-z]+)?

如果您希望使用单字母单词,请将 + 替换为 *

【讨论】:

  • 这将返回所有大写单词,而不仅仅是字符串中的第一个或两个大写单词。
猜你喜欢
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
相关资源
最近更新 更多