我正在尝试拆分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/

10-16 08:56