我无法解决这个看似简单的正则表达式问题;说我有以下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 捕获组(附加到第一次我添加了额外的括号组。) 请帮忙,我有点难过。欢呼声。
答案 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.
或更清楚......
col1 text PRIMARY KEY NOT NULL
col2 text
- 醇>
col3 text
- 更新的答案 -
使用以下正则表达式
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语言的限制,但是使用匹配也会导致额外的"''''每场比赛空字符串。如果它们是我所展示的问题,请删除它们,如果这有帮助......