找回密码
 加入
搜索
查看: 1650|回复: 9

[网络通信] sqlite列出表所有字段,求个配套的正则

[复制链接]
发表于 2019-9-13 00:55:09 | 显示全部楼层 |阅读模式
本帖最后由 heavenm 于 2019-9-13 01:27 编辑

2种方法,网上一般都流传第一种方法.终于找到方法2,我觉得第二条语句好用多了
1.
PRAGMA table_info([table_name])

2.
SELECT sql FROM sqlite_master WHERE tbl_name = 'table_name' AND type = 'table'


下面这个奇怪的数据表名称可以用正则获取到正确的表名么
如果遇见奇怪的数据库名称比如 aa"a数据库查询出来的结果是 ,中间多了一个双引号
CREATE TABLE "level" (
  "aa""a" TEXT,
  "bb" TEXT
)
### 友情提示:本脚本由 Au3.REHelper 于 2019/09/13 01:21 自动生成,不保证其正确性,请自行测试 ###
#include <Array.au3>
Local $sSource = _
                'CREATE TABLE "level" (' & @CRLF & _
                '  "a' & "'a" & '""a" TEXT,' & @CRLF & _
                '  "bb" TEXT' & @CRLF & _
                ')'
;~MsgBox(0, '源字符串', $sSource)
Local $aSRE = StringRegExp($sSource, '"(.+)"', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($aSRE), '其中[0]元素为: ' & $aSRE[0])
_ArrayDisplay($aSRE, UBound($aSRE))
其实这种数据库名称应该不会出现,
可我就是突然想到了
突然好奇
然后突然想不到解法
突然觉得我是吃饱撑着了
发表于 2019-9-13 11:07:27 | 显示全部楼层
先匹配
"((?:[^"]|"")*)"
再将连体的2引号合1
 楼主| 发表于 2019-9-13 13:19:09 | 显示全部楼层
连afan都要2步,应该确实是需要2步
算了,就用一步,这种奇怪的数据表应该是不会出现的,想想如果确实要各种奇葩的元素都考虑,那要弄的情况肯定太多了,实用为先
 楼主| 发表于 2019-9-13 14:45:40 | 显示全部楼层
本帖最后由 heavenm 于 2019-9-13 14:51 编辑

忍不住还是动手了
### 友情提示:本脚本由 Au3.REHelper 于 2019/09/13 14:41 自动生成,不保证其正确性,请自行测试 ###
Local $sSource = _
                'CREATE TABLE "test" (' & @CRLF & _
                '  "(1""2""""3""""""4""""""""5"""""""""")" TEXT' & @CRLF & _
                ')'
;~MsgBox(0, '源字符串', $sSource)
Local $sSRERe = StringRegExpReplace($sSource, '(?si).*?\((.*)\).*', '\1')
MsgBox(0, '替换结果', $sSRERe)
(?si).*?\((.*)\).*
先过滤第一遍,获取字段信息,这条正则可以匹配一些奇葩的数据库名称比如:(1"2""3"""4""""5""""")
第二遍过滤双引号就OK了
StringRegExpReplace($sSource, '""', '"')
 楼主| 发表于 2019-9-13 14:52:35 | 显示全部楼层
(?si).*?\(\s*(.*)\s*\).*
这样子用效果更好
### 友情提示:本脚本由 Au3.REHelper 于 2019/09/13 14:53 自动生成,不保证其正确性,请自行测试 ###
Local $sSource = _
                'CREATE TABLE "test" (' & @CRLF & _
                '  "(1""2""""3""""""4""""""""5"""""""""")" TEXT,' & @CRLF & _
                '  "aaaaaa" TEXT' & @CRLF & _
                ')'
;~MsgBox(0, '源字符串', $sSource)
Local $sSRERe = StringRegExpReplace($sSource, '(?si).*?\(\s*(.*)\s*\).*', '\1')
MsgBox(0, '替换结果', $sSRERe)

发表于 2019-9-13 14:54:34 | 显示全部楼层
heavenm 发表于 2019-9-13 14:45
忍不住还是动手了

(1"2""3"""4""""5""""")
这个根本就是不合法的…  匹配不合法的根本没用
1# 的 aa""a 是合法的
 楼主| 发表于 2019-9-13 14:59:16 | 显示全部楼层
afan 发表于 2019-9-13 14:54
(1"2""3"""4""""5""""")
这个根本就是不合法的…  匹配不合法的根本没用
1# 的 aa""a 是合法的


可以创建这种 奇怪名称的数据库,sqlite

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2019-9-13 15:04:37 | 显示全部楼层
heavenm 发表于 2019-9-13 14:59
可以创建这种 奇怪名称的数据库,sqlite

这个是明文,是可以的,一楼的 aa""a 明文是 a"a,如果 (1"2""3"""4""""5""""") 是明文是可以的,如果是引号字符串那应该就是 (1""2""""3""""""4""""""""5"""""""""") 才行
 楼主| 发表于 2019-9-13 15:11:48 | 显示全部楼层
afan 发表于 2019-9-13 15:04
这个是明文,是可以的,一楼的 aa""a 明文是 a"a,如果 (1"2""3"""4""""5""""") 是明文是可以的,如果是 ...

嗯对,数据库结构里面就是这样子,一个双引号会变成2个双引号,对噢我把他转换成单双引号了,执行是不是就有问题了,还要再转换回来
逗比了好像,根本不用转换引号好像
 楼主| 发表于 2019-9-13 15:13:42 | 显示全部楼层
真的 是这样子
如果是用来执行的时候,引号不用转换,显示的时候再转换引号,原来如此,没想到这个问题刚刚
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 08:40 , Processed in 0.118335 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表