继续模式匹配以标识SQL子句

时间:2015-06-06 06:52:38

标签: regex r

我试图在R中编写一个函数,它使用正则表达式从SQL代码中识别表名。

我正在使用捕获组来识别在来自加入之后找到的任何单词/ alpha-num表达式,但是 if 我的理解是正确的,捕获组只允许最后捕获的组可访问。

##sample SQL code:
mySql <- 'select all from table1 join table2 join table3 join new_table3'

##regex:
gsub('.*(from|join)\\s*([[:alnum:]]+_*[[:alnum:]]+).*', '\\1 : \\2', mySql)

##result is only the last table in SQL code:
##"join : new_table3"

但我想要的是所有要返回的表名,如下所示:

from : table1
join : table2
join : table3
join : new_table3

或者这甚至是正则表达式的有效用法,正如我认为的那样?

2 个答案:

答案 0 :(得分:3)

你可以尝试

cat(gsub('.*?(from|join)\\s+([[:alnum:]_]+)', '\\1 : \\2\n', mySql))
#from : table1
#join : table2
#join : table3
#join : new_table3

答案 1 :(得分:2)

你通过添加?使你的模式变得非贪婪(贪婪会尝试吃尽可能多的角色..这就是为什么你只得到最后的模式):

.*?(from|join)\\s+([[:alnum:]]+_*[[:alnum:]]+)
  ↑                                         

请参阅DEMO