我正在尝试使用regexp提取数据库表的列定义,但似乎无法破解它:
这是我的表情:
(\".*?),\"
这是表数据的示例:
"tstamp" DATETIME NOT NULL DEFAULT (datetime('now','localtime')) ,"macid" VARCHAR NOT NULL ,"id" INTEGER NOT NULL DEFAULT (null) ,"info" VARCHAR,"temp" DOUBLE NOT NULL , "altemp" DOUBLE, "active" BOOL DEFAULT true, "emailts" INTEGER, "alarmts" INTEGER DEFAULT 0, "algrace" INTEGER DEFAULT 15, 'sid' VARCHAR, 'led' INTEGER DEFAULT 0, 'sends' INTEGER DEFAULT 0, PRIMARY KEY ("macid","id")
这就是我所追求的:
"tstamp" DATETIME NOT NULL DEFAULT (datetime('now','localtime'))
"macid" VARCHAR NOT NULL
"id" INTEGER NOT NULL DEFAULT (null)
...
但是我得到的是:
"tstamp" DATETIME NOT NULL DEFAULT (datetime('now','localtime'))
" VARCHAR NOT NULL
" INTEGER NOT NULL DEFAULT (null)
...
似乎是在忽略开始条件,只有第一个匹配是正确的。
我究竟做错了什么 ?
在我看来,您需要这样的东西:
['"].*?(?=,\s*(?![^)(]*\))['"]|$)
我们匹配一个开头的引号,然后将所有内容懒惰地匹配.*?
到一个点,在此点之前,我们(?=,\s*(?![^)(]*\))['"]|$)
可以断言以下字符要么是逗号,然后是可选空格(后跟任意数量的非括号字符,后跟一个右括号)和右引号,或者字符串的结尾($
锚点)。
这是一口吗?
是的。下面的可视化和按令牌逐个演练为您提供了更多详细信息,但是在我看来,没有什么替代方法可以在功能齐全的regex工具中构建这样的表达式。这样,您就可以在创建表达式时实时看到匹配的变化。
原件有什么问题?
您的比赛实际上吃了以下逗号和开头的引号:,\"
因此,在第一次比赛之后,引擎与字符串不同步。
逐令牌解释
['"]
.*?
*?
(?=,\s*(?![^)(]*\))['"]|$)
,\s*(?![^)(]*\))['"]
,
\s*
*
(?![^)(]*\))
[^)(]*
*
\)
['"]
$
$
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句