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

时间:2019-05-09 13:25:30

标签: 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, 通过首先创建多个模式的列表,然后将其传递 通过str_extract吗?

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

delete from pear.admin 

如何去除前面的第一句话?我尝试了(.*),但没有尝试 似乎有效。

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

5 个答案:

答案 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)

这是一种非正则表达式方法,使用strsplitfrom中分离出来,并从第二个元素中提取第一个单词,即

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

注意::如果您的表名不要(并且不应)中有空格

,这将起作用

答案 2 :(得分:0)

我只想要fromwhere之间的内容(据我了解),请尝试以下regex

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

答案 3 :(得分:0)

您可以使用

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

请参见a demo on regex101.com

答案 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")