我需要regex
专家来解决这个问题。它与我遗失的SO问题有关,数据如下:
x = c("IID:WE:G12D/V/A", "GH:SQ:p.R172W/G", "HH:WG:p.S122F/H")
我需要拆分x
的每个元素以隔离可以由letter - slash - letter - .... slash - letter
构成的结尾部分。
我想要的是获得这两个向量作为输出:
o1 = c("IID:WE:G12", "GH:SQ:p.R172", "HH:WG:p.S122")
o2 = c("D/V/A", "W/G", "F/H")
我有o1
的解决方案:
gsub('[A-Z]/.+','',x)
#[1] "IID:WE:G12" "GH:SQ:p.R172" "HH:WG:p.S122"
好。对于o2
,我尝试使用断言,特别是前瞻断言:
gsub('.+(?=[A-Z]/.+)','',x, perl=T)
#[1] "V/A" "W/G" "F/H"
但这不是想要的结果!
知道第二个正则表达式出了什么问题吗?
答案 0 :(得分:3)
作为一种可能的解决方案,您可以使用以下替代品:
gsub('.*?([^/](?:/[^/])+)$','\\1',x, perl=T)
或(如果必须有一封信):
gsub('.*?([A-Z](?:/[A-Z])+)$','\\1',x, perl=T)
请参阅IDEONE demo
.*?
- 从一开始就匹配尽可能少的字符([^/](?:/[^/])+)
- 匹配的捕获组:
[^/]
- /
以外的字符(或 - 如果[A-Z]
- 任何英文大写字母)(?:/[^/])+
- 一个或多个/
序列和/
以外的字符(如果使用[A-Z]
,则为大写字母)。$
- 字符串结尾答案 1 :(得分:3)
以下内容非常接近您提出的内容:
gsub('[^/]+(?=[A-Z]/.+)','',x, perl=T)
(你的线路没有用,因为你要求"任何角色",其中包括" \")
答案 2 :(得分:1)
试试这个:
gsub('\\w(?=\\/).*','',x,perl=T)
gsub('.*\\d(?=\\w\\/)','',x, perl=T) #For O2
正则表达式展望未来:
int func(int angle) {
return ((((angle + 180) % 360) + 360) % 360) - 180;
}