【发布时间】:2019-08-30 23:06:25
【问题描述】:
我需要设计一个复杂的 REGEX 模式,但在相当长的一段时间内我没有取得重大进展:
基本上我想从文本中提取作者年份的引用。我使用 REGEX 从括号中的文本中提取了引用
\(\K[^\)]+
有几种情况和变体可以获得作者:
Simple: Smith, 2000 or Smith 2000
Multiple authors: Smith/Miller 2001 or Smith & Miller, 2001
Authors with hyphens: Smith-Miller, 2001, Max-Planck-Society, 2001
Authors with accents: O'Neill 2001
Organizations with all caps: ACME Company
And permutations of the above cases
由于我只将文本保留在括号内,因此消除了大部分误报,但存在一些特殊情况:
- et al./etal./u.a./u.一个。需要保留
- 名字后面应该有一年 ([0=9]{4})
- 有时姓氏后面有逗号(Miller/Smith, 2001)
- 需要支持国际字符
最简单的方法是这样的:
\b[\p{Lu}\/].*?[0-9]{4}\b
但它被证明是贪婪的,导致大量不需要的文本。
到目前为止,我最好的方法是:
(([\p{Lu}]+[\p{Lu}\p{Ll}\-\' ]*)+)([\/](?1))*([ ](et[ ]{0,1}al\.)|(u\.[ ]{0,1}a\.)){0,1}[,]*([ ][0-9]{4})
但它有一些问题:
- 只有在有逗号 (,) 时才能识别多人
- 所以 Smith/Miller 2001 无法识别,但 Smith/Miller, 2001 可以。
有简单的可行解决方案吗?喜欢:得到一切,那
- 不以小写开头
- 可以包含 [\'/ ]i>
- 后跟 4 位数字:[0-9]{4}
- 可以包含“等”。数字前
- 可以用/分隔
我尝试在这里测试正则表达式及其用例:https://regex101.com/r/HEA0rg/8
【问题讨论】:
-
你确定这是上下文无关语法吗?
标签: regex