我正在尝试解决http://play.inginf.units.it/#/level/10
我有一些字符串如下:
title={自动摇摆装置},
author={Diaz, Navarro David和Gines, 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次或多次b
a字边界
查看regex101演示。