【问题标题】:Regex: Separated by nested parentheses and semicolon正则表达式:由嵌套括号和分号分隔
【发布时间】:2021-02-23 10:51:42
【问题描述】:

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

史密斯,安娜(剑桥大学); Doe, Jane(维也纳大学(奥地利)); Doe, John(东京大学;麻省理工学院) 穆勒,汉斯(FU柏林(德国));施密德,朱莉娅(); Doe, John(加州理工学院); Boe, Jane(维也纳工业大学) Kim, Lee(纳扎尔巴耶夫大学(哈萨克斯坦);牛津大学)

换句话说,该模式包含Surname, Name (Affiliation);(如果没有其他人跟随,则没有;),其中括号可以可选地嵌套( () )或包含;或为空()

我想提取每个名字和从属关系,如:

史密斯,安娜(剑桥大学) Doe, Jane(维也纳大学(奥地利)) Doe, John(东京大学;麻省理工学院) 汉斯·穆勒 (FU Berlin (Germany)) 施密德,朱莉娅 () 能源部,约翰(加州理工学院) Boe, Jane(维也纳工业大学) Kim, Lee(纳扎尔巴耶夫大学(哈萨克斯坦);牛津大学)

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

我对@9​​87654327@ 的尝试效果不佳...

【问题讨论】:

  • 如果只能有一个嵌套的括号级别,您可以使用类似\w+,\s*\w+\s*\([^()]*(?:\([^()]*\)[^()]*)*\);? (demo)
  • 太好了,谢谢@WiktorStribiżew!你想把它作为一个完整的回复发布,以便我接受吗?

标签: regex text extract regex-lookarounds


【解决方案1】:

由于您的预期匹配只能有一个嵌套括号级别,您可以使用

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

请参阅regex demo

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

详情

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

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多