首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex前瞻性断言

Regex前瞻性断言
EN

Stack Overflow用户
提问于 2015-07-21 14:09:26
回答 3查看 93关注 0票数 2

我需要一个regex专家来解决这个问题。它与我丢失的一个如此问题有关,其中的数据如下:

代码语言:javascript
复制
x = c("IID:WE:G12D/V/A", "GH:SQ:p.R172W/G", "HH:WG:p.S122F/H")

我需要对x的每个元素进行拆分,以分离可以由letter - slash - letter - .... slash - letter组成的结束部分。我想要的是获得这两个向量作为输出:

代码语言:javascript
复制
o1 = c("IID:WE:G12", "GH:SQ:p.R172", "HH:WG:p.S122")
o2 = c("D/V/A", "W/G", "F/H")

我有o1的解决方案

代码语言:javascript
复制
gsub('[A-Z]/.+','',x)
#[1] "IID:WE:G12"   "GH:SQ:p.R172" "HH:WG:p.S122"

好的。对于o2,我尝试使用断言,特别是前瞻性断言:

代码语言:javascript
复制
gsub('.+(?=[A-Z]/.+)','',x, perl=T)
#[1] "V/A" "W/G" "F/H"

但这不是通缉的结果!

你知道第二个正则表达式出了什么问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-21 14:26:40

以下内容非常接近你想出的结果,将起作用:

gsub('[^/]+(?=[A-Z]/.+)','',x, perl=T)

(您的行没有工作,因为您要求“任何字符”,其中包括"\")

票数 3
EN

Stack Overflow用户

发布于 2015-07-21 14:20:15

作为一种可能的解决方案,您可以使用以下替换:

代码语言:javascript
复制
gsub('.*?([^/](?:/[^/])+)$','\\1',x, perl=T)

或者(如果必须有一封信):

代码语言:javascript
复制
gsub('.*?([A-Z](?:/[A-Z])+)$','\\1',x, perl=T)

请参阅IDEONE演示

  • .*? -从一开始就匹配尽可能少的字符,而不是换行符
  • ([^/](?:/[^/])+) -捕获组匹配:
    • [^/] - /以外的字符(或者-如果[A-Z] -任何英文大写字符)
    • (?:/[^/])+ -1或更多的/序列和/以外的字符(如果使用[A-Z],则为大写字母)。

  • $ -字符串的结尾
票数 3
EN

Stack Overflow用户

发布于 2015-07-21 14:25:53

试试这个:

代码语言:javascript
复制
gsub('\\w\\/.*(\\/.*)?','',x)

Regex展望未来:

代码语言:javascript
复制
gsub('\\w(?=\\/).*','',x,perl=T)

gsub('.*\\d(?=\\w\\/)','',x, perl=T)  #For O2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31541480

复制
相关文章

相似问题

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