我正在编写一个代码,该代码需要大量SQL查询,并旨在将查询仅分解为表名。
例如,我有以下查询:
delete from pear.admin where jdjdj
delete from pear.admin_user where blah
delete from ss_pear.admin_user where blah
我正在尝试获得一个与所有这些模式都匹配的regex
,
通过首先创建多个模式的列表,然后将其传递
通过str_extract
吗?
我使用了正则表达式,但它提供了以下输出:
delete from pear.admin
如何去除前面的第一句话?我尝试了(.*)
,但没有尝试
似乎有效。
sql_data$table_name <-
str_extract(sql_data$Full.Sql, "[^_]+\\.[\\w]+\\_[\\w]+")
答案 0 :(得分:4)
我只熟悉基本的R regex函数,因此这是使用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"
这应该至少在某种程度上可靠地执行,因为据我所知,紧随关键字FROM
之后的必须是表名。
答案 1 :(得分:3)
这是一种非正则表达式方法,使用strsplit
从from
中分离出来,并从第二个元素中提取第一个单词,即
sapply(strsplit(queries, ' from '), function(i)gsub('\\s.*', '', i[2]))
#[1] "pear.admin" "pear.admin_user" "ss_pear.admin_user"
注意::如果您的表名不要(并且不应)中有空格
,这将起作用答案 2 :(得分:0)
我只想要from
和where
之间的内容(据我了解),请尝试以下regex
gsub("(.*from )(.*)( where.*)","\\2",sql.data$Full.Sql)
答案 3 :(得分:0)
答案 4 :(得分:0)
这里是qdapRegex::ex_between
的选项,没有正则表达式
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")