R正则表达式在单引号之间获取文本

时间:2015-08-02 23:32:37

标签: regex r

我有像

这样的文字
la<-c("case when ANTIG_CLIENTE <= 4 then '01: ANTIG_CLIENTE <= 4' when ANTIG_CLIENTE <= 8 then '02: ANTIG_CLIENTE <= 8' 
else '99: Error' end ")

我想在单引号之间提取文本作为列表:

"01: ANTIG_CLIENTE <= 4","02: ANTIG_CLIENTE <= 8","99: Error"

我尝试了两种方法但没有成功

> sub('[^\]+\"([^\']+).*', '\\1', la)
Error: '\]' is an unrecognized escape in character string starting "'[^\]"
> regmatches(x, gregexpr('"[^']*"', la))[[1]]
Error: unexpected ']' in "regmatches(x, gregexpr('"[^']"

如何在单引号之间获取文字?

1 个答案:

答案 0 :(得分:3)

这应该得到你想要的。唯一的假设是,单引号之间所需的所有字符串都包含冒号(否则,我们应该如何将'01: ANTIG_CLIENTE <= 4'' when ANTIG_CLIENTE <= 8 then '区分开来,两者都在单引号之间?):

> regmatches(la,gregexpr("'[^']*:[^']*'",la))
[[1]]
[1] "'01: ANTIG_CLIENTE <= 4'" "'02: ANTIG_CLIENTE <= 8'" "'99: Error'"   

基本上,我们试图返回单引号的所有表达式(因此gregexpr而不是regexpr),除了单引号,冒号,单引号之外的东西,单引号

如果你想在返回的内容中删除单引号,那么你需要前瞻和后瞻,这需要告诉R将你的正则表达式解释为perl:

> regmatches(la,gregexpr("(?<=')[^']*:[^']*(?=')",la,perl=T))
[[1]]
[1] "01: ANTIG_CLIENTE <= 4" "02: ANTIG_CLIENTE <= 8" "99: Error"