4

@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 结束,而不是第一个。

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

4

1 回答 1

6

您已经匹配了多次 - 就是gsub这样,而sub只匹配一次。

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

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

那应该给你:

sql<- gsub(" \\(.*?AS", "", sql)
"a, b, c, d"
于 2013-08-20T19:15:03.127 回答