R - 使用正则表达式的子文本

时间:2013-08-20 18:43:14

标签: regex r

@Greg Snow非常友好地向我介绍了使用正则表达式进行模式匹配。我用他的建议来执行以下操作:

sql <- "SELECT a, b, (q + r) AS c, (s + t) AS d FROM tbl WHERE x=y"
sql <- gsub("^.*SELECT *(.*?) +FROM.*$", "\\1", sql)
"a, b, (q + r) AS c, (s + t) AS d"

我很好奇,并试图扩展这个逻辑来取代“逗号之后的所有内容,包括'AS':

sql<- gsub(" \\(.*AS", "\\1", sql)
"a, b, d"

我希望它返回“a,b,c,d”。但是,我看到发生了什么 - 它在整个字符串中匹配我的模式,以“b”之后的逗号开头,并以第二个AS结束,而不是第一个。

我的问题是,如何在同一个字符串中多次匹配模式?我知道我的语法有问题。

1 个答案:

答案 0 :(得分:6)

您已经多次匹配 - 这是gsub的作用,而sub只匹配一次。

问题是双重的。首先,你的正则表达式是“贪婪的”。这是默认设置,意味着.*之类的内容尽可能匹配,而不是尽可能少。你可以使它非贪婪,使它只匹配“(q + r)AS”和“(s + t)AS”而不是整个事物。然后,由于您已经在使用gsub,因此匹配将自动发生多次。

第二件事实际上不是问题,只是没必要。您的第二个字符串显示"\\1",即“替换为捕获的第一组”。但是,没有第一个捕获组!相反,只需使用空字符串。

那应该给你:

sql<- gsub(" \\(.*?AS", "", sql)
"a, b, c, d"
相关问题