首页 > 解决方案 > 正则表达式:匹配多个模式并获取字符串的中间

问题描述

我正在编写一个代码,该代码需要一堆 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]+")

标签: rregexstringr

解决方案


我只熟悉基本的 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" 

这应该至少在某种程度上可靠地执行,因为据我所知,紧跟在关键字后面的FROM必须是表名。


推荐阅读