正则表达式:“之间”:和空格

时间:2013-10-02 13:49:26

标签: regex

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

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

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

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

  1. ([^:]+$) - > 10.1039 / c1ob05128h。 Epub 2011年3月28日。
  2. ([^\s]+) - > 10.1039 / c1ob05128h。
  3. 但是如何将这些结合起来却很无能为力。如果这很困难,那么没有必要,但会简化我的计算。

    我也无法弄清楚如何摆脱最后的“。”这不是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. 
    

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

    enter image description here

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

    • Chem Commun(Camb)。 2012年12月25日; 48(99):12094-6。 doi:10.1039 / c2cc35588d。
    • Org Biomol Chem。 2013年1月7日; 11(1):27-30。 doi:10.1039 / c2ob26587g。
    • Chem Commun(Camb)。 2013年1月25日; 49(7):671-3。 doi:10.1039 / c2cc37953h。
    • Org Lett。 2010年10月1日; 12(19):4248-51。 doi:10.1021 / ol101920b.Chemistry。 2010年7月26日; 16(28):8537-44。 doi:10.1002 / chem.201000773。
    • Chem Commun(Camb)。 2012年12月25日; 48(99):12094-6。 doi:10.1039 / c2cc35588d。
    • Org Biomol Chem。 2013年1月7日; 11(1):27-30。 doi:10.1039 / c2ob26587g。
    • Chem Commun(Camb)。 2013年1月25日; 49(7):671-3。 doi:10.1039 / c2cc37953h。
    • Org Lett。 2010年10月1日; 12(19):4248-51。 doi:10.1021 / ol101920b。
    • 化学。 2010年7月26日; 16(28):8537-44。 doi:10.1002 / chem.201000773。

3 个答案:

答案 0 :(得分:2)

如果你只想让.消失,这似乎有效:

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

所以我们只是将.放在括号之外,因此它不会与字符串组合在一起。

如果要在2个单独的字符串中提取10.1039/c1ob05128hEpub 2011 Mar 28,可以使用groups执行此操作。你可以使正则表达式像:

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

鉴于第二部分似乎是可选的,我们需要用括号括起来,我们将?标记为可选(并且?:使其成为非捕获组,所以你不要不会在你的第二个细胞中得到它而不是你想要的东西。

Google似乎会自动将=CONTINUE(..., 1, 2)填入下一个单元格,从而为您提供彼此相邻的两个组合。

追求.的可选

首先我尝试说\.?,但显然[^\s]+会消耗.(这是不合适的)。

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

这导致我:

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

这允许使用可选的.,但如果最后有.个,那么它将无效。假设我们在输出中不需要这些,可以通过将\.?更改为\.*来轻松修复。

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

答案 1 :(得分:0)

=REGEXEXTRACT(cell;"doi: ([.\d]+\/[\w\.]+)\.(?: |$)")

- >它提取10.1039 / c1ob05128h
无需组合正则表达式,可以立即完成。

我在所有示例中都尝试过它,但它确实有用。

答案 2 :(得分:0)

我相信这可能会成功:

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

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