Regex: сопоставление нескольких шаблонов и получение середины строки - PullRequest
4 голосов
/ 09 мая 2019

Я работаю над кодом, который принимает несколько запросов 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 ]

4 голосов
/ 09 мая 2019

Я знаком только с базовыми функциями регулярного выражения 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 должно быть имя таблицы.

3 голосов
/ 09 мая 2019

Вот подход без регулярных выражений, использующий strsplit для разделения от from и извлечения первого слова из второго элемента, т.е.

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

ПРИМЕЧАНИЕ: Этобудет работать, если имена вашей таблицы НЕ (и не должны) содержать пробелы

0 голосов
/ 09 мая 2019

Вот вариант с 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")
0 голосов
/ 09 мая 2019

Вы можете использовать

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

См. демонстрацию на regex101.com .

0 голосов
/ 09 мая 2019

Если вы хотите только то, что находится между from и where (из того, что я понял), попробуйте следующее regex

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