我正在寻找一条正则是在字符串中找到第一个或两个大写字样。如果前两个单词大写,我想要前两个单词。连字符应视为单词的一部分。
- 对于
Madonna has a new album
,我正在寻找madonna
- 对于
Paul Young has no new album
,我正在寻找Paul Young
- 对于
Emmerson Lake-palmer is not here
,我正在寻找Emmerson Lake-palmer
我一直在使用^[A-Z]+.*?b( [A-Z]+.*?b){0,1}
,它在前两个方面非常出色,但是对于第三个示例,我获得了Emmerson Lake
,而不是Emmerson Lake-palmer
。
我可以用什么义务在上述示例中找到第一个或两个大写字母?
您可以使用
^[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]*)?
-可选(由于?
量词(的可选序列:-
s+
-1 Whitespace -
[A-Z]
-大写ASCII字母 -
[-a-zA-Z]*
-零或更多ASCII字母/连字符
-
一个Unicode Aware等效(对于支持Unicode属性类的正则风味(:
^p{Lu}[-p{L}]*(?:s+p{Lu}[-p{L}]*)?
p{L}
匹配任何字母, p{Lu}
匹配任何大写字母。
这可能更简单:
^([A-Z][-A-Za-z]+)(s[A-Z][-A-Za-z]+)?
如果您期望单字母单词,将+
替换为*
。
如果您需要一个全名仅( a两个单词带有第一个大写字母(,这是一个简单的示例:
^([A-Z][a-z]*)(s)([A-Z][a-z]+)$
尝试。享受!