heavenm 发表于 2019-9-13 00:55:09

sqlite列出表所有字段,求个配套的正则

本帖最后由 heavenm 于 2019-9-13 01:27 编辑

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

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), '其中元素为: ' & $aSRE)
_ArrayDisplay($aSRE, UBound($aSRE))

{:1_197:}其实这种数据库名称应该不会出现,
可我就是突然想到了
突然好奇
然后突然想不到解法
突然觉得我是吃饱撑着了

afan 发表于 2019-9-13 11:07:27

先匹配
"((?:[^"]|"")*)"
再将连体的2引号合1

heavenm 发表于 2019-9-13 13:19:09

连afan都要2步,应该确实是需要2步
算了,就用一步,这种奇怪的数据表应该是不会出现的,想想如果确实要各种奇葩的元素都考虑,那要弄的情况肯定太多了,实用为先

heavenm 发表于 2019-9-13 14:45:40

本帖最后由 heavenm 于 2019-9-13 14:51 编辑

{:1_199:}忍不住还是动手了
### 友情提示:本脚本由 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, '""', '"')

heavenm 发表于 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)


afan 发表于 2019-9-13 14:54:34

heavenm 发表于 2019-9-13 14:45
忍不住还是动手了




(1"2""3"""4""""5""""")
这个根本就是不合法的…匹配不合法的根本没用
1# 的 aa""a 是合法的

heavenm 发表于 2019-9-13 14:59:16

afan 发表于 2019-9-13 14:54
(1"2""3"""4""""5""""")
这个根本就是不合法的…匹配不合法的根本没用
1# 的 aa""a 是合法的


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

afan 发表于 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"""""""""") 才行

heavenm 发表于 2019-9-13 15:11:48

afan 发表于 2019-9-13 15:04
这个是明文,是可以的,一楼的 aa""a 明文是 a"a,如果 (1"2""3"""4""""5""""") 是明文是可以的,如果是 ...

嗯对,数据库结构里面就是这样子,一个双引号会变成2个双引号,对噢我把他转换成单双引号了,执行是不是就有问题了,还要再转换回来
{:1_183:}逗比了好像,根本不用转换引号好像

heavenm 发表于 2019-9-13 15:13:42

{:1_199:}真的 是这样子
如果是用来执行的时候,引号不用转换,显示的时候再转换引号,原来如此,没想到这个问题刚刚
页: [1]
查看完整版本: sqlite列出表所有字段,求个配套的正则