R 正则表达式:匹配多个模式并获得字符串的中间部分
我正在编写一段代码,该代码接受大量SQL查询,目的是将查询分解为表名 例如,我有以下查询: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
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”查询检查它们之间是否有空格。您可能需要从|到