我知道这里有一些类似“组合2正则表达式”的帖子,但我已经尝试了解决方案并且不断出错。
我有正则表达式来解析描述,例如:
Org Biomol Chem. 2011 May 7;9(9):3549-59. doi: 10.1039/c1ob05128h. Epub 2011 Mar 28.
提取DOI(数字对象标识符):
([^:]+$)
- > 10.1039 / c1ob05128h。 Epub 2011年3月28日。([^\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.
到目前为止我所做的所有尝试都给出了与此相同的结果:
Dukeling建议“doi :( [^ \ s] +)。?([^:] +)。?”的一些例外,原因不明,是:
答案 0 :(得分:2)
如果你只想让.
消失,这似乎有效:
"doi: ([^\s]+)\."
所以我们只是将.
放在括号之外,因此它不会与字符串组合在一起。
如果要在2个单独的字符串中提取10.1039/c1ob05128h
和Epub 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.