R 正则表达式:匹配多个模式并获得字符串的中间部分

R 正则表达式:匹配多个模式并获得字符串的中间部分,r,regex,stringr,R,Regex,Stringr,我正在编写一段代码,该代码接受大量SQL查询,目的是将查询分解为表名 例如,我有以下查询: delete from pear.admin where jdjdj delete from pear.admin_user where blah delete from ss_pear.admin_user where blah 我试图得到一个匹配所有这些模式的regex,是吗 通过先创建多个模式的列表,然后传递它 通过stru提取 我使用了正则表达式,但它提供了以下输出: delete from

我正在编写一段代码,该代码接受大量SQL查询,目的是将查询分解为表名

例如,我有以下查询:

delete from pear.admin where jdjdj
delete from pear.admin_user where blah
delete from ss_pear.admin_user where blah 
我试图得到一个匹配所有这些模式的
regex
,是吗 通过先创建多个模式的列表,然后传递它 通过
stru提取

我使用了正则表达式,但它提供了以下输出:

delete from pear.admin 
我怎样才能去掉它前面的第一个单词?我试过
(.*)
,但什么也没做 似乎有效

sql_data$table_name <- 
str_extract(sql_data$Full.Sql, "[^_]+\\.[\\w]+\\_[\\w]+")

sql\u data$table\u nameI您只需要介于
from
where
(据我所知)之间的内容,请尝试以下
regex

gsub("(.*from )(.*)( where.*)","\\2",sql.data$Full.Sql)

我只熟悉基本R正则表达式函数,因此这里有一个使用
sub
的选项:

queries <- c("delete from pear.admin where jdjdj",
             "delete from pear.admin_user where blah",
             "delete from ss_pear.admin_user where blah")

table_names <- sapply(queries, function(x) {
    sub(".*\\bfrom\\s+(\\S+).*", "\\1", x)
})
table_names

           1                    2                    3 
"pear.admin"    "pear.admin_user" "ss_pear.admin_user" 
查询您可以使用

gsub(".*?from\\s(\\S+).*","\\1", sql.data$Full.Sql)

请参阅。

这里有一个选项,在
之间带有
qdapRegex::ex_,不带正则表达式

qdapRegex::ex_between(x, "from", "where")

#[[1]]
#[1] "pear.admin"

#[[2]]
#[1] "pear.admin_user"

#[[3]]
#[1] "ss_pear.admin_user"
数据

x <- c("delete from pear.admin where jdjdj", 
       "delete from pear.admin_user where blah", 
       "delete from ss_pear.admin_user where blah")

x这里是一种非正则表达式方法,使用
strsplit
中拆分,并从第二个元素中提取第一个单词,即

sapply(strsplit(queries, ' from '), function(i)gsub('\\s.*', '', i[2]))
#[1] "pear.admin"         "pear.admin_user"    "ss_pear.admin_user"

注意:如果您的表名中没有(也不应该有)空格,这将起作用

但情况并非总是如此。在表名称后面大约有600个不同单词的查询。虽然不太可能,但是您的模式可能会接受另一个单词,其中包含来自
,作为它的子字符串。因此,为了安全起见,您应该在
from
之前放置一个单词边界。如果查询在from子句之后有一个或多个join子句,则此操作将失败。但是,它恰好适用于提供的三个示例查询。@TimBiegeleisen我不确定联接查询是什么样子,但是,有一个
ex\u-between\u-multiple
可以提取“from”和“where”之间的多个works实例。在MySQL中,从pear.admin t1内部删除并在t1.id=t2.id上连接其他表t2,其中jdjdj
。我想说的是,一般来说,表名可能不在
FROM
WHERE
之间。不使用带空格的表名和列名至少是最佳做法。如果表名中确实有空格,则必须使用双引号、反勾号或方括号对其进行转义,具体取决于特定的数据库。投票结果为+1,答案非常简洁。如果不是所有的查询都包含来自?有些是“插入到”有没有办法将前两个单词而不是具体的“from”拆分成“当然,只要做
strsplit(查询,'from | insert into')
我现在正试着这样做,但这不是万能的,我做了“from | into”,它对带有from的单词没有任何作用,只填写了“into”查询检查它们之间是否有空格。您可能需要从|到