我正在尝试拆分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)
我想找回所有描述各列的内容。我尝试过这些
\(([^\)]*)\)
在第一个(50)处停止,
并读取其他(50)和(6),但不会读取其他任何内容,并且不会到达该外部括号的末尾。
\((\d+)\)
这只会读取内部括号,以后可能会有用,但是我只得到两个(50)和(6)。
什么正则表达式将捕获该括号的所有内部内容?即使它确实捕获了更多,我也可以稍后再通过代码删除多余的字符串。
最佳答案
.NET正则表达式称为Balancing Groups。这样可以确保在开始定界符后跟结束定界符(两者均可选择)。如果这些不平衡,它将在字符串中的该点停止匹配。
这是使用正则表达式完成此操作的方式,但是其他替代方法则较不易破解,可能更适合该任务。
See regex in use here
(?<=\()(?:[^()]|(?<B>\()|(?<-B>\)))+(?(B)(?!))(?=\))
(?<=\()
确保在后面出现的积极回溯是(
(?:[^()]|(?<B>\()|(?<-B>\)))+(?(B)(?!))
魔术。简单地说,它匹配不是(
或)
的任何字符,或者将(
设置为B
时匹配B+1
字符,或者将)
设置为B。 cc>。它执行一次或多次。 B-1
表示如果(?(B)(?!))
不平衡(0以外的任何值),它将失败。B
正向前瞻确保(?=\))
以下两个匹配结果:
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
和
OIDS = FALSE
要删除后一个结果,可以使用以下命令(确保在
)
之后没有(
)as seen in use here。(?<=(?<!WITH *)\()(?:[^()]|(?<B>\()|(?<-B>\)))+(?(B)(?!))(?=\))
关于c# - 正则表达式捕获所有外部括号之间的内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48993528/