0

我知道这里有很多类似的“组合 2 个正则表达式”帖子,但我已经尝试了解决方案并不断出错。

我有正则表达式来解析描述,例如:

Org Biomol Chem. 2011 May 7;9(9):3549-59. doi: 10.1039/c1ob05128h. Epub 2011 Mar 28.

提取 DOI(数字对象标识符):

  1. ([^:]+$)--> 10.1039/c1ob05128h。电子版 2011 年 3 月 28 日。
  2. ([^\s]+)--> 10.1039/c1ob05128h。

但是对于如何将这些结合起来我一无所知。如果这很困难,那么就没有必要,但会简化我的计算。

我也不知道如何摆脱最后一个“。” 这不是 DOI 字符串的一部分(为了记录,DOI 中可能有超过 2 个句号,因此正则表达式不能简单地是“在第二个句号之后”)。

应要求提供的其他一些示例:

Chem Soc Rev. 2008 Nov;37(11):2413-21. doi: 10.1039/b719548f. Epub 2008 Sep 16.
Small. 2010 Dec 20;6(24):2796-820. doi: 10.1002/smll.201001881. Review.
Org Lett. 2010 Oct 1;12(19):4248-51. doi: 10.1021/ol101920b.
Chemistry. 2010 Dec 27;16(48):14285-9. doi: 10.1002/chem.201002111. No abstract available. 

到目前为止,我所做的所有尝试都给出了与此大致相同的结果:

在此处输入图像描述

杜克林建议的“doi: ([^\s]+).? ([^:]+).?”的一些例外,原因不明,是:

  • 化学通讯(Camb)。2012 年 12 月 25 日;48(99):12094-6。doi: 10.1039/c2cc35588d。
  • 组织生物分子化学。2013 年 1 月 7 日;11(1):27-30。doi:10.1039/c2ob26587g。
  • 化学通讯(Camb)。2013 年 1 月 25 日;49(7):671-3。doi: 10.1039/c2cc37953h。
  • 组织莱特。2010 年 10 月 1 日;12(19):4248-51。doi:10.1021/ol101920b.化学。2010 年 7 月 26 日;16(28):8537-44。doi: 10.1002/chem.201000773。
  • 化学通讯(Camb)。2012 年 12 月 25 日;48(99):12094-6。doi: 10.1039/c2cc35588d。
  • 组织生物分子化学。2013 年 1 月 7 日;11(1):27-30。doi:10.1039/c2ob26587g。
  • 化学通讯(Camb)。2013 年 1 月 25 日;49(7):671-3。doi: 10.1039/c2cc37953h。
  • 组织莱特。2010 年 10 月 1 日;12(19):4248-51。doi: 10.1021/ol101920b。
  • 化学。2010 年 7 月 26 日;16(28):8537-44。doi: 10.1002/chem.201000773。
4

3 回答 3

2

如果您只想.消失,这似乎可行:

"doi: ([^\s]+)\."

所以我们只是把.括号放在外面,所以它不会与字符串分组。

如果您想提取10.1039/c1ob05128h2Epub 2011 Mar 28个单独的字符串,您可以使用groups来执行此操作。您可以使正则表达式类似于:

"doi: ([^\s]+)\.(?: ([^:]+)\.)?"

鉴于第二部分似乎是可选的,我们需要用括号括起来,我们将其标记为可选?(并?:使其成为非捕获组,因此您不会在第二个单元格中得到它,而不是在你想要的)。

谷歌似乎会自动填充=CONTINUE(..., 1, 2)到下一个单元格中,这样您就可以将两组彼此相邻。

追求使.'s 的可选性

起初我只是说\.?,但显然[^\s]+随后将消耗.(这是不希望的)。

所以你需要在括号内包含一些东西来防止这种情况。具体来说,您需要检查最后一个字符并确保它不是..

这导致我:

"doi: ([^\s]*[^.\s])\.?(?: ([^:]*[^.:])\.?)?"

这允许可选.的,但如果最后有超过 1 个.,它将不起作用。假设我们的输出中不需要这些,可以通过将 更改为 轻松\.?修复\.*

"doi: ([^\s]*[^.\s])\.*(?: ([^:]*[^.:])\.*)?"
于 2013-10-02T14:19:44.900 回答
0
=REGEXEXTRACT(cell;"doi: ([.\d]+\/[\w\.]+)\.(?: |$)")

--> 提取 10.1039/c1ob05128h
不需要组合正则表达式,一次搞定。

我在你所有的例子上都试过了,它有效。

于 2013-10-02T13:53:52.317 回答
0

我相信这可能会奏效:

/doi: ((\S+)(?:\. .+)?)\.$/

最外面的组(捕获较长的字符串)是捕获组 1,最里面的组是捕获组 2。

于 2013-10-02T14:15:24.790 回答