正则表达式:由嵌套括号和分号分隔

Regex: Separated by nested parentheses and semicolon

我的字符串如下所示(每一行都是一个示例字符串):

Smith, Anna (Univ Cambridge); Doe, Jane (Univ Vienna (Austria)); Doe, John (Univ Tokyo; MIT)

Mueller, Hans (FU Berlin (Germany)); Schmid, Julia (); Doe, John (CalTech); Boe, Jane (TU Wien)

Kim, Lee (Nazarbayev Univ (Kazakhstan); Univ Oxford)

换句话说,该模式包含 Surname, Name (Affiliation);(如果后面没有其他人,则不包含 ;),因此括号可以选择性地嵌套 ( () ) 或包含 ; 或为空 ().

我想提取每个姓名和隶属关系,如:

Smith, Anna (Univ Cambridge)
Doe, Jane (Univ Vienna (Austria))
Doe, John (Univ Tokyo; MIT)
Mueller, Hans (FU Berlin (Germany))
Schmid, Julia ()
Doe, John (CalTech)
Boe, Jane (TU Wien)
Kim, Lee (Nazarbayev Univ (Kazakhstan); Univ Oxford)

执行此操作的正确正则表达式是什么?

我对 (?<=\()(?:[^()]+|\([^)]+\))+ 的尝试效果不佳...

由于您预期的匹配项只能有一层嵌套括号,因此您可以使用

\w+,\s*\w+\s*\([^()]*(?:\([^()]*\)[^()]*)*\);?

参见regex demo

根据您的正则表达式库是否支持递归或平衡结构,这可以进一步增强以匹配任何深度的括号短语。

详情:

  • \w+ - 一个或多个单词字符
  • , - 逗号
  • \s* - 零个或多个空格
  • \w+\s* - 一个或多个单词,然后是零个或多个空白字符
  • \( - 一个 ( 字符
  • [^()]* - ()
  • 以外的零个或多个字符
  • (?:\([^()]*\)[^()]*)* - 零个或多个 (...) 子串序列,中间没有 (),然后是 ( 以外的零个或多个字符和 )
  • \);? - ) 然后是可选的 ;.