gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:28:45 26 4
gpt4 key购买 nike

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

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

最佳答案

您已经多次匹配 - 这就是 gsub确实如此,而 sub只匹配一次。

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

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

那应该给你:

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

关于regex - R - 使用正则表达式的子文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18342710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com