我知道这里有大量类似的“合并2个正则表达式”的帖子,但是我已经尝试了解决方案,并不断地得到错误。
我有正则表达式来解析如下描述:
Org Biomol Chem. 2011 May 7;9(9):3549-59. doi: 10.1039/c1ob05128h. Epub 2011 Mar 28.要提取DOI (数字对象标识符):
([^:]+$) ->10.1039/c1ob05128 h。2011年3月28日。([^\s]+) ->10.1039/c1ob05128 h。但我对如何把它们结合起来却一无所知。如果这很困难,那就没有必要了,但会简化我的计算。
我也想不出最后的办法是什么“。这不是DOI字符串的一部分(为了记录,DOI中可能有两个以上的句号,所以regex不能简单地“在第二个句号之后”)。
所要求的其他一些例子:
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+). (^:+).“建议的一些例外情况是:
发布于 2013-10-02 14:19:44
如果您只希望.消失,这似乎是可行的:
"doi: ([^\s]+)\."所以我们只是把.放在括号之外,这样它就不会与字符串一起分组了。
如果您想要在两个单独的字符串中提取10.1039/c1ob05128h和Epub 2011 Mar 28,可以使用群组进行此操作。您可以将regex设置为:
"doi: ([^\s]+)\.(?: ([^:]+)\.)?"考虑到第二部分似乎是可选的,我们需要用括号包围它,用?标记为可选的(而?:使它成为一个非捕获组,所以您不会在第二个单元格中得到它,而不是您想要的)。
谷歌似乎会自动将=CONTINUE(..., 1, 2)填充到下一个单元格中,这样你就可以把两个组放在一起了。
追求使.**'s 成为可选的**
起初,我只想说\.?,但显然[^\s]+会使用. (这是不需要的)。
因此,您需要在括号中包含一些内容,以防止出现这种情况。具体来说,您需要检查最后一个字符,并确保它不是.。
这促使我:
"doi: ([^\s]*[^.\s])\.?(?: ([^:]*[^.:])\.?)?"这允许可选的.,但是如果最后有一个以上的.,它就不能工作。假设我们不想在输出中使用这些,那么通过将\.?更改为\.*很容易修复这些问题。
"doi: ([^\s]*[^.\s])\.*(?: ([^:]*[^.:])\.*)?"发布于 2013-10-02 13:53:52
=REGEXEXTRACT(cell;"doi: ([.\d]+\/[\w\.]+)\.(?: |$)")->提取10.1039/c1ob05128 h
不需要组合正则表达式,它可以立即完成。
我在你的所有例子上都试过了,它起作用了。
发布于 2013-10-02 14:15:24
我相信这可能会有效果:
/doi: ((\S+)(?:\. .+)?)\.$/最外层的组(捕捉较长的字符串)是捕获组1,最内部的组是捕获组2。
https://stackoverflow.com/questions/19138502
复制相似问题