RegEx与我的例子不符

时间:2018-03-28 17:48:59

标签: javascript regex

此RegEx找不到示例字符串。

正则表达式:

^ALTER\\sTABLE\\sADMIN_\\sADD CONSTRAINT \\s(.*)\\sPRIMARY KEY \\s(\(.*\))\\.([a-zA-Z0-9_]+)

示例:

ALTER TABLE ADMIN_ ADD CONSTRAINT PK_ADMIN_ PRIMARY KEY (RECNOADM);

我是regex的新手并试图在REGEX101.COM完成我的RegEx但没有成功。我错过了什么?

Djorjde

3 个答案:

答案 0 :(得分:1)

^\s*ALTER\s+TABLE\s+ADMIN_\s+ADD\s+CONSTRAINT\s+(.+)\s+PRIMARY\s+KEY\s*\((.+)\)\s*;\s*$

此表达式将与您用作示例的SQL语句匹配,在第一组中捕获PK_ADMIN_,在第二组中捕获RECNOADM

我的建议是始终使用\s+来匹配空格(\s*,如果它们是可选的,比如前导空格或尾随空格),除非它们必须完全一个空间。

让我们打破正则表达式:

  1. ^标记该行的开头。如果之前还有其他任何内容,您不希望该行匹配。
  2. \s*可选的前导空格。
  3. ALTER\s+TABLE\s+ADMIN_\s+ADD\s+CONSTRAINT无论使用的间距如何,都会匹配ALTER TABLE ADMIN_ ADD CONSTRAINT
  4. \s+(.+)\s+然后,下一个有空位的单词**将被捕获到第一组中。你在这里接受任何角色!也许您可能希望将其限制为\w+等。除非您接受空组,否则请使用+闭包(即一个或多个),而不是*一个(即零或更多)
  5. PRIMARY\s+KEY再次匹配序列PRIMARY KEY,无论间距如何。
  6. \s*\((.+)\)这将捕获括号内的任何内容,作为第二个捕获组中的PK。
    1. \s*表示它可以可选前面有任意数量的空格(虽然它们是可选的。如果我没记错的话,它们在SQL中)
    2. \( ... \)您必须转义括号,因为它们是匹配的字符,没有正则表达式的特殊字符。
    3. (.+)在这里,您(在未转义的括号之间)将(转义的)括号之间的所有内容捕获到捕获组中。在这种情况下的第二个。
  7. \s*;\s*句子必须以分号结尾,可选地在任何空格之前和/或之后。
  8. $标记该行的结尾。
  9. 如果您想要在同一行中接受多个句子,则需要删除^$零宽度分隔符。

    关于转义,这里最简单的方法是简单地加倍你在编辑器中构建的表达式中的每个反斜杠:^\\s*ALTER\\s+TABLE\\s+ADMIN_\\s+ADD\\s+CONSTRAINT\\s+(.+)\\s+PRIMARY\\s+KEY\\s*\\((.+)\\)\\s*;\\s*$但是,有一些上下文和/或语言可能需要更复杂的转义(例如,Linux shell)

    **请注意,在4中,内部表达式.+将占用尽可能多的字符,只要其余部分也与字符串匹配即可。这是因为闭包默认是贪婪的,这意味着引擎将尝试匹配可能的最长字符串。这意味着,例如,此条目将匹配:ALTER TABLE ADMIN_ ADD CONSTRAINT PK_ADMIN_ OR *WHATEVER* YOU "WANT" TO PUT HERE! PRIMARY KEY (RECNOADM);,在第一组中捕获PK_ADMIN_ OR *WHATEVER* YOU "WANT" TO PUT HERE!。因此限制接受字符集的重要性;)

答案 1 :(得分:0)

您是否尝试过以下操作?

//check the capacity if(dockCapactiy >= 10) { System.out.println("Dock Full"); return; } else { dock1[dockCapacity] = ship; dockCapacity++; }

我正在通过for(int i = 0; i < dock1.length; i++) { if(dock1[i] == null) { System.out.println("Dock " + i + " is empty"); } else { System.out.println("Dock " + i + ": " + dock1[i].getShipName() + ", Size: " + dock1[i].getShipSize()); } } 包装两个单独的块,以便在您需要访问它们时从正则表达式中识别插入的值。

在正则表达式中,白色空格几乎没有问题(将空格与\ s混合在一起,白色空格应该不是\ s)

答案 2 :(得分:0)

在JavaScript中,只需要在从字符串组成正则表达式时转义属于转义序列的反斜杠,例如:

var r = new RegExp('\\d');
console.log(r.test('2'));

但是额外的\不是正则表达式的一部分,在使用文字语法(或regexp101)时你不需要它:

var r = /\d/;
console.log(r.test('2'));