捕获分隔组和可选组的空格
Capturing whitespace separating a group and an optional group
我正在尝试通过以下任务实现正则表达式。
字符串包含状态名称。在国家名称的末尾,可选的括号可能包含其他信息。
有效字符串示例:
- 美国纽约
- 美国加利福尼亚州(美国)
- 美国马萨诸塞州(美国)
在州名和第一个括号之间,可能存在 space。正则表达式应提取州名称,删除可选内容,以及 space 分隔州名称和可选内容。
目前我正在使用以下正则表达式:
(?P<country>[A-Za-z ,]+)(?: {0,1})(?=[(])?(?:[(]\w*[)])?
然而不幸的是,由于 (?: {0,1})(?=[(])?
的贪婪,分隔州名和可选内容的白色 space 永远不会被捕获,如此 regex101 所示。
期望的结果将是 New York, US
、California, United States of America
和 Massachusetts, United States of America
.
有什么建议吗?
在您的模式 (?P<country>[A-Za-z ,]+)(?: {0,1})(?=[(])?(?:[(]\w*[)])?
中,您可以省略 (?=[(])?
,因为它是可选的并且永远为真,并且 (?: {0,1})
可以写成 ?
由于您不想在最后的匹配中将可选部分放在括号之间,您也可以选择不匹配它并使模式更具体一些
\b(?P<country>[A-Za-z]+(?:,? [A-Za-z]+)+)\b
模式匹配:
\b
一个单词边界
(?P<country>
命名组国家
[A-Za-z]+
匹配 1+ 个字符 a-z
(?:,? [A-Za-z]+)+
重复 1 次以上匹配可选逗号和 space 后跟 1+ 个字符 a-z
)
关闭命名组
\b
一个单词边界
如果字符串末尾带括号的部分是可选的,而你想匹配整个字符串,可以引入锚点断言模式的开始和结束。
然后你可以使用字符class [A-Za-z ,]+?
的非贪婪方法
^(?P<country>[A-Za-z ,]+?) ?(?:[(]\w*[)])?$
我正在尝试通过以下任务实现正则表达式。 字符串包含状态名称。在国家名称的末尾,可选的括号可能包含其他信息。 有效字符串示例:
- 美国纽约
- 美国加利福尼亚州(美国)
- 美国马萨诸塞州(美国)
在州名和第一个括号之间,可能存在 space。正则表达式应提取州名称,删除可选内容,以及 space 分隔州名称和可选内容。 目前我正在使用以下正则表达式:
(?P<country>[A-Za-z ,]+)(?: {0,1})(?=[(])?(?:[(]\w*[)])?
然而不幸的是,由于 (?: {0,1})(?=[(])?
的贪婪,分隔州名和可选内容的白色 space 永远不会被捕获,如此 regex101 所示。
期望的结果将是 New York, US
、California, United States of America
和 Massachusetts, United States of America
.
有什么建议吗?
在您的模式 (?P<country>[A-Za-z ,]+)(?: {0,1})(?=[(])?(?:[(]\w*[)])?
中,您可以省略 (?=[(])?
,因为它是可选的并且永远为真,并且 (?: {0,1})
可以写成 ?
由于您不想在最后的匹配中将可选部分放在括号之间,您也可以选择不匹配它并使模式更具体一些
\b(?P<country>[A-Za-z]+(?:,? [A-Za-z]+)+)\b
模式匹配:
\b
一个单词边界(?P<country>
命名组国家[A-Za-z]+
匹配 1+ 个字符 a-z(?:,? [A-Za-z]+)+
重复 1 次以上匹配可选逗号和 space 后跟 1+ 个字符 a-z
)
关闭命名组\b
一个单词边界
如果字符串末尾带括号的部分是可选的,而你想匹配整个字符串,可以引入锚点断言模式的开始和结束。
然后你可以使用字符class [A-Za-z ,]+?
^(?P<country>[A-Za-z ,]+?) ?(?:[(]\w*[)])?$