如何使用正则表达式匹配由"and"分隔的名称,不包括"and"本身?



我正在尝试解决http://play.inginf.units.it/#/level/10

我有一些字符串如下:

title={自动摇摆装置},
author={Diaz, Navarro DavidGines, Rodriguez Noe},
= {2006}

title={神经外科中的坐姿:488例回顾性分析},
作者={Standefer, MichaelandBay, Janet Wandrusso, Russell},
杂志={神经外科}

title={燃料电池及其应用},
作者={Kordesch, KarlandSimader, G{"u}nterandWiley, John},
体积= {117}

我需要匹配粗体中的名称。我尝试了以下regex:

(?<=author={).+(?=})

但是它匹配{}里面的整个字符串。我明白为什么是这样,但我怎么能打破模式与and?

我花了一点时间才把样本显示在你的链接中。是什么:

(?:^s*author={|G(?!^) and )K(?:(?! and |},).)+

查看在线演示


  • (?:^s*author={|G(?!^) and )-匹配行开头跟随0+空格字符,并从字面上匹配'author={'
  • K-重置报告匹配的起始点;
  • (?:(?! and |},).)+-匹配任何,如果后面没有' and '匹配'}'后加逗号。

以上也将匹配"其他"根据链接测试中的最后一个样本。如果您希望排除"其他",那么可以按以下方式将该选项添加到否定列表中:

(?:^s*author={|G(?!^) and )K(?:(?! and |},|bothersb).)+

查看在线演示


在我们上面建立的评论部分将不适用于给定的链接网站。显然它是基于JS的,支持零宽度后视。因此尝试:

(?<=bauthor={(?:(?!},).*?))b[A-Z]S*b(?:,? [A-Z]S*b)*

参见演示

  • (?<=-打开后视;
    • bauthor={-匹配word-boundary and literal 'author={';
    • (?:(?!},).*?))-打开非捕获组以匹配'},'和0+(惰性)字符的负向前看。关闭向后插入;
  • b[A-Z]S*b-匹配以大写字母a - z开头,后跟0+非空白字符的两个单词边界之间的任何内容;
  • (?:,? [A-Z]S*b)*-第二个非捕获组,用于保持名称的逗号/空格分隔部分的匹配。

如果支持使用向后看断言并匹配单词字符,则可以使用:

(?<=bauthor={[^{}]*(?:{[^{}]*}[^{}]*)*)[A-Z][^s,]*,(?:s+[A-Z][^s,]*)+b

  • (?<=正向前看,断言当前位置的左边是
    • bauthor={匹配author={前面加字边界
    • [^{}]*(?:{[^{}]*}[^{}]*)*匹配{以外的可选字符}或匹配{...}
  • )关闭后视镜
  • [A-Z]匹配大写字符A-Z
  • [^s,]*,可选地匹配除,以外的非空白字符,然后匹配,
  • (?:非捕获组作为整个部分重复
    • s+[A-Z][^s,]*匹配1+空白字符,大写字符A-Z,可选的非空白字符,,
    • 除外
  • )+关闭非捕获组并重复1次或多次
  • ba字边界

查看regex101演示。

最新更新