捕获分隔组和可选组的空格

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, USCalifornia, United States of AmericaMassachusetts, 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一个单词边界

Regex demo

如果字符串末尾带括号的部分是可选的,而你想匹配整个字符串,可以引入锚点断言模式的开始和结束。

然后你可以使用字符class [A-Za-z ,]+?

的非贪婪方法
^(?P<country>[A-Za-z ,]+?) ?(?:[(]\w*[)])?$

Regex demo