Regexp从create table语句

时间:2015-06-11 10:27:52

标签: javascript regex web-sql

我无法解决这个看似简单的正则表达式问题;说我有以下CREATE TABLE声明:

CREATE TABLE foo (col1 text PRIMARY KEY NOT NULL, col2 text, col3 text)

我正在努力实现的基本上是写一个 javascript 正则表达式,它将返回这3个匹配项:

1. `col1 text PRIMARY KEY NOT NULL`
2. `col2 text`
3. `col3 text`

这将是进一步推理的起点我不会进入。
this awesome site我尝试粘贴以下正则表达式:

/CREATE TABLE (?:\w+)\s\(((?:\w+?)\s(?:\w+?)(?:\sPRIMARY KEY NOT NULL)?(?:,\s)?)+\)/

根据示例语句对其进行测试,它只返回一个匹配,最后一个匹配:

1. `col3 text`

在“说明”侧窗格中有一条说明:

  

重复捕获组仅捕获最后一次迭代。如果您对数据不感兴趣,请在重复组周围放置捕获组以捕获所有迭代或使用非捕获组

所以我尝试相应地修改我的正则表达式,方法是在重复的组周围添加一个捕获组(在第一个 literal 之后“(”和相应的“之前)),现在它显示为:

/CREATE TABLE (?:\w+)\s\((((?:\w+?)\s(?:\w+?)(?:\sPRIMARY KEY NOT NULL)?(?:,\s)?)+)\)/

但结果不是我要求的结果,因为上面的结果是:

1. `col1 text PRIMARY KEY NOT NULL, col2 text, col3 text`
2. `col3 text`

另外,上面关于仅捕获最后一次迭代的注释,我认为在对重复组进行分组后会消失,但仍然存在,只有它位于 2nd 捕获组(附加到第一次我添加了额外的括号组。) 请帮忙,我有点难过。欢呼声。

1 个答案:

答案 0 :(得分:0)

也许这会奏效?

var string = "CREATE TABLE foo (col1 text PRIMARY KEY NOT NULL, col2 text, col3 text)"
var regex = /\(([\w|\s]*),\s*([\w|\s]*),\s*([\w|\s]*)\)/;

string.match(regex).slice(1);
// result: ["col1 text PRIMARY KEY NOT NULL", "col2 text", "col3 text"];

Note: .slice(1) just removes the original string, which is automatically included when using String.prototype.match.

或更清楚......

  
      
  1. col1 text PRIMARY KEY NOT NULL
  2.   
  3. col2 text
  4.   
  5. col3 text
  6.   

- 更新的答案 -

使用以下正则表达式

var regex = /(\w\s*\w+)*(?=\)|,)/gi;

关于以下字符串

var stringOne = "CREATE TABLE foo (col1 text PRIMARY KEY NOT NULL)"
var stringTwo = "CREATE TABLE foo (col1 text PRIMARY KEY NOT NULL, col2 text)"
var stringThree = "CREATE TABLE foo (col1 text PRIMARY KEY NOT NULL, col2 text, col3 text, col4 text, col5 text, col6, text, col7 text, col8 text)"

将导致以下匹配

  

注意:使用String.prototype.match会导致返回的数组为空字符串;和匹配一样多的空字符串。据我所知,这不是正则表达式的一部分,而是使用.match()的一部分。因此,匹配的数组可能需要额外的步骤才能删除"''""。

-

  

ex。 " [" col1 text PRIMARY KEY NOT NULL","",&#34}的初始返回值; col2 text",""]"   需要两个"''"删除元素以获得最接近您问题的答案。但是,你很多人不在乎他们在那里,所以可能不需要删除它们。我将使用.filter();

在以下示例中删除它们
function emptyStrings( string ){
  return !!string;
}

然后以下变量将返回

stringOne.match(regex).filter(emptyStrings);
// => ["col1 text PRIMARY KEY NOT NULL"]

stringTwo.match(regex).filter(emptyStrings);
// => ["col1 text PRIMARY KEY NOT NULL", "col2 text"]

stringThree.match(regex).filter(emptyStrings);
// => ["col1 text PRIMARY KEY NOT NULL", "col2 text", "col3 text", "col4 text", "col5 text", "col6", "text", "col7 text", "col8 text"]

这个更新的正则表达式应该继续匹配JS语言的限制,但是使用匹配也会导致额外的"''''每场比赛空字符串。如果它们是我所展示的问题,请删除它们,如果这有帮助......

相关问题