我的Regexp应该是什么?

时间:2017-12-05 01:15:56

标签: javascript python ruby regex

我试图从字符串定义中获取所有检查约束,如下所示

  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)部分。

我应该如何更改正则表达式(如果可以的话)以使其正常工作?正则表达式的特定语言方言无关紧要。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

Ruby的Onigmo引擎功能非常强大,允许您检查括号嵌套。

/CONSTRAINT\s+(\w+)\s+CHECK\s+(?<paren>\((?:[^()]|\g<paren>)+\))/i

最后的位(?<paren>\((?:[^()]|\g<paren>)+\))是平衡括号表达式的递归定义:“paren”是左括号,然后是非括号字符或“paren”,重复任意数量的倍;然后是一个封闭的括号;我们现在想要其中一个。

不幸的是,Python和JavaScript都不允许你这样做。

答案 1 :(得分:0)

&#13;
&#13;
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;
&#13;
&#13;