首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式:“中间”:和一个空格

正则表达式:“中间”:和一个空格
EN

Stack Overflow用户
提问于 2013-10-02 13:49:25
回答 3查看 102关注 0票数 0

我知道这里有大量类似的“合并2个正则表达式”的帖子,但是我已经尝试了解决方案,并不断地得到错误。

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

代码语言:javascript
复制
Org Biomol Chem. 2011 May 7;9(9):3549-59. doi: 10.1039/c1ob05128h. Epub 2011 Mar 28.

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

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

但我对如何把它们结合起来却一无所知。如果这很困难,那就没有必要了,但会简化我的计算。

我也想不出最后的办法是什么“。这不是DOI字符串的一部分(为了记录,DOI中可能有两个以上的句号,所以regex不能简单地“在第二个句号之后”)。

所要求的其他一些例子:

代码语言:javascript
复制
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+). (^:+).“建议的一些例外情况是:

  • Chem Commun (Camb)2012年12月25日;48(99):12094-6。doi: 10.1039/c2cc35588d。
  • 组织生物化学。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。
  • 里特。2010年10月1日;12(19):4248-51。doi: 10.1021/ol101920年b.化学。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。
  • 组织生物化学。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。
  • 里特。2010年10月1日;12(19):4248-51。doi: 10.1021/ol101920b.
  • 化学。2010年7月26日;16(28):8537-44。doi: 10.1002/chem.201000773。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-02 14:19:44

如果您只希望.消失,这似乎是可行的:

代码语言:javascript
复制
"doi: ([^\s]+)\."

所以我们只是把.放在括号之外,这样它就不会与字符串一起分组了。

如果您想要在两个单独的字符串中提取10.1039/c1ob05128hEpub 2011 Mar 28,可以使用群组进行此操作。您可以将regex设置为:

代码语言:javascript
复制
"doi: ([^\s]+)\.(?: ([^:]+)\.)?"

考虑到第二部分似乎是可选的,我们需要用括号包围它,用?标记为可选的(而?:使它成为一个非捕获组,所以您不会在第二个单元格中得到它,而不是您想要的)。

谷歌似乎会自动将=CONTINUE(..., 1, 2)填充到下一个单元格中,这样你就可以把两个组放在一起了。

追求使.**'s 成为可选的**

起初,我只想说\.?,但显然[^\s]+会使用. (这是不需要的)。

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

这促使我:

代码语言:javascript
复制
"doi: ([^\s]*[^.\s])\.?(?: ([^:]*[^.:])\.?)?"

这允许可选的.,但是如果最后有一个以上的.,它就不能工作。假设我们不想在输出中使用这些,那么通过将\.?更改为\.*很容易修复这些问题。

代码语言:javascript
复制
"doi: ([^\s]*[^.\s])\.*(?: ([^:]*[^.:])\.*)?"
票数 2
EN

Stack Overflow用户

发布于 2013-10-02 13:53:52

代码语言:javascript
复制
=REGEXEXTRACT(cell;"doi: ([.\d]+\/[\w\.]+)\.(?: |$)")

->提取10.1039/c1ob05128 h

不需要组合正则表达式,它可以立即完成。

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

票数 0
EN

Stack Overflow用户

发布于 2013-10-02 14:15:24

我相信这可能会有效果:

代码语言:javascript
复制
/doi: ((\S+)(?:\. .+)?)\.$/

最外层的组(捕捉较长的字符串)是捕获组1,最内部的组是捕获组2。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19138502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档