gpt4 book ai didi

javascript - 正则表达式与我的示例不匹配

转载 作者:行者123 更新时间:2023-12-03 02:11:35 25 4
gpt4 key购买 nike

此正则表达式找不到示例字符串。

正则表达式:

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

示例:

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

我是正则表达式新手,尝试在 REGEX101.COM 上完成我的正则表达式,但没有成功。我错过了什么?

乔吉德

最佳答案

^\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+然后,下一个空格限制的单词**将被捕获到第一组中。你在这里接受任何 Angular 色!也许您可能希望将其限制为 \w+或类似的。除非您接受空组,否则请使用 +闭包(即一个或多个),而不是 *一个(即零个或多个)
  5. PRIMARY\s+KEY匹配序列PRIMARY KEY再次强调,无论间距如何。
  6. \s*\((.+)\)这将捕获括号内的任何内容作为第二个捕获组中的 PK。
    1. \s*意味着它可以可选前面添加任意数量的空格(尽管它们是可选的。如果我没记错的话,它们在 SQL 中)
    2. \( ... \)您必须转义括号,因为它们是要匹配的字符,没有正则表达式的特殊字符。
    3. (.+)在这里,您将(在未转义的括号之间)(转义的)括号之间的所有内容捕获到捕获组中。本例中是第二个。
  7. \s*;\s*句子必须以分号结尾,前面和/或后面可以有任何空格。
  8. $标记行尾。

如果您想在同一行中接受多个句子,您可以删除 ^$零宽度分隔符。

关于转义,最简单的方法是将编辑器中构建的表达式中的每个反斜杠加倍:^\\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!在第一组中。因此,限制可接受的字符集非常重要;)

关于javascript - 正则表达式与我的示例不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49541068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com