我试图从字符串定义中获取所有检查约束,如下所示
CREATE TABLE products(
id INT PRIMARY KEY NOT NULL,
price REAL,
title TEXT,
CONSTRAINT price_check CHECK ( price > 0),
constraint title_check CHECK (length(title) > 5 AND (price <= 100.0))
);
使用以下regexp /CONSTRAINT\s+(\w+)\s+CHECK\s+\((.+?)\)/i
,但它不匹配第二个约束,只有constraint title_check CHECK (length(title)
部分。
我应该如何更改正则表达式(如果可以的话)以使其正常工作?正则表达式的特定语言方言无关紧要。谢谢你的帮助。
答案 0 :(得分:1)
Ruby的Onigmo引擎功能非常强大,允许您检查括号嵌套。
/CONSTRAINT\s+(\w+)\s+CHECK\s+(?<paren>\((?:[^()]|\g<paren>)+\))/i
最后的位(?<paren>\((?:[^()]|\g<paren>)+\))
是平衡括号表达式的递归定义:“paren”是左括号,然后是非括号字符或“paren”,重复任意数量的倍;然后是一个封闭的括号;我们现在想要其中一个。
不幸的是,Python和JavaScript都不允许你这样做。
答案 1 :(得分:0)
console.log("CREATE TABLE products(\nid INT PRIMARYNULL,\npriceREAL,\ntitleTEXT,\nCONSTRAINT price_check CHECK ( price > 0),\nconstraint title_check CHECK (length(title) > 5 AND (price <= 100.0))\n );".match(/^.*constraint.*check.*$/gim));
&#13;