怎么写正则匹配逗号分割的最后的表名?

John
  • 8

我现在有这样的SQL

select dt from a.b.c where dt = '20210808' limit 10

我想先通过前缀namespace 进行匹配,如果匹配成功就返回表名, 比如我这里有 a.d. 多个前缀, a. 存在匹配成功,然后返回表名c 。如果这里是a.b 就返回b,这个正则该怎么写?用sed 或者 awk 甚至在PHP中实现

现在这个是我用PHP写的,但是获取的不是我想要的

$sql = "select dt from a.b.c where dt = '20210808' limit 10";
$tmp_table_name_parten = '/\.([^.]*$)/';
preg_match_all($tmp_table_name_parten, $sql, $match);
result:[[".c where dt = '20210808' limit 10"],["c where dt = '20210808' limit 10"]]

我现在能想到的就是基于空格+前缀+空格 这种形式来匹配表名,另外就是在sed awk 里怎么写呢?
另外还有一点需要注意就是a.b.c会有下划线的情况,例如: a_a.b_b.c

回复
阅读 715
3 个回答

(?<=\.)[^.\s]+(?!\.)(?=\s|$)

sed 不支持零宽断言。可以用下面这个,不过会把.和后面的空白符一并选中。

echo -e 'select dt from a_a.b_b.c_c where dt = 20210808 limit 10' | sed -n 's/\.\w\+\s/*****/ p'

表名不就两级么? 哪个数据库里面的表名会有三级+的?

select\s+.+\s+from\s+\w+\.(\w+)\.
分组里面的内容就是这个表名

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏