我正在尝试拆分 SQL 查询脚本,并且在创建表上,我只想要最外面括号内的内容,而忽略内部的任何括号,这些括号主要描述列类型的最大字符数。
这是我的查询示例:
CREATE TABLE IF NOT EXISTS %SCHEMA%.business (
id UUID NOT NULL,
name VARCHAR(50) NOT NULL,
DBA VARCHAR(50),
isactive BOOL NOT NULL DEFAULT TRUE,
isdeleted BOOL NOT NULL DEFAULT FALSE,
createdon TIMESTAMP(6) WITHOUT TIME ZONE NOT NULL
)
WITH (OIDS = FALSE)
Run Code Online (Sandbox Code Playgroud)
我想取回描述列的所有内容。我已经尝试过这些
\(([^\)]*)\)
Run Code Online (Sandbox Code Playgroud)
在第一个 (50) 处停止,并读取另一个 (50) 和 (6),但不读取其他任何内容,并且不会到达外部括号的末尾。
\((\d+)\)
Run Code Online (Sandbox Code Playgroud)
这只会读取里面的括号,这稍后可能有用,但我只返回两个 (50) 和 (6)。
什么正则表达式可以捕获括号内的所有内容?即使它确实捕获了更多,我也可以稍后通过代码删除多余的字符串。
.NET regular expressions have what's called Balancing Groups. This ensures that a starting delimiter is followed by a closing delimiter (both of your choice). If these do not balance it stops matching at that point in the string.
This is how you'd accomplish this using regex, but other alternatives are less breakable and may be better suited for the task.
(?<=\()(?:[^()]|(?<B>\()|(?<-B>\)))+(?(B)(?!))(?=\))
Run Code Online (Sandbox Code Playgroud)
(?<=\() Positive lookbehind ensuring what precedes is ((?:[^()]|(?<B>\()|(?<-B>\)))+(?(B)(?!))魔术。简单地说,它匹配任何不是(或 的字符),或者匹配(设置为 时的字符B,B+1或者匹配)设置为 时的B字符B-1。它执行此操作一次或多次。(?(B)(?!))表示如果B不平衡(除 0 之外的任何值),则失败。(?=\))正向前瞻确保接下来的内容是)以下两场比赛的结果:
id UUID NOT NULL,
name VARCHAR(50) NOT NULL,
DBA VARCHAR(50),
isactive BOOL NOT NULL DEFAULT TRUE,
isdeleted BOOL NOT NULL DEFAULT FALSE,
createdon TIMESTAMP(6) WITHOUT TIME ZONE NOT NULL
Run Code Online (Sandbox Code Playgroud)
和
OIDS = FALSE
Run Code Online (Sandbox Code Playgroud)
要删除后一个结果,您可以使用以下内容(确保(后面没有WITH),如此处使用所示。
(?<=(?<!WITH *)\()(?:[^()]|(?<B>\()|(?<-B>\)))+(?(B)(?!))(?=\))
Run Code Online (Sandbox Code Playgroud)