【问题标题】:REGEX for finding author-year citations用于查找作者年份引用的正则表达式
【发布时间】: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


【解决方案1】:

您可以使用分隔符为空格或正斜杠的重复模式来匹配以大写字符开头的单词并使et al. 部分可选。

如果支持 \h,您可以使用它来匹配 1+ 个水平空白字符而不是空格。

\p{Lu}[\p{Lu}\p{Ll}'-]*(?:[ \/]\p{Lu}[\p{Lu}\p{Ll}'-]*)*(?: et al\.)?,? [0-9]{4}

图案部分

  • \p{Lu}匹配大写字符
  • [\p{Lu}\p{Ll}'-]* 匹配重复 0+ 次字符类中的内容
  • (?:非捕获组
    • [ \/]\p{Lu}匹配空格或/,以大写字符a开头匹配
    • [\p{Lu}\p{Ll}'-]* 匹配任何列出的 0+ 次
  • )*关闭组并重复0+次
  • (?: et al\.)? 可选匹配等。
  • ,? [0-9]{4}匹配可选的逗号和空格,然后匹配4位数字

Regex demo

【讨论】:

  • 非常感谢!这按预期工作。在(?:[ \/]\p{Lu}[\p{Lu}\p{Ll}'-]*) 中使用非捕获组有什么理由吗?
  • 非捕获组重复在[ \/] 前面的字符类中接受的内容,这将匹配空格或/,因此您不能有多个空格或//
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多