Regex 正则表达式搜索2个最近的关键字

Regex 正则表达式搜索2个最近的关键字,regex,Regex,我想在创建表中搜索关键字时间戳。这是我的正则表达式: (?i)(\s+|^)CREATE\s+TABLE\s+\[\s*\bdbo\b\s*\]\.\[\w+\]\s*\(\s*((.|\n)*)\bTIMESTAMP 但它在一个查询中搜索createtable,在另一个查询中搜索TIMESTAMP 您能帮助我吗?当您只想搜索创建表和时间戳时,您可以使用以下简单的正则表达式: (?i)(CREATE TABLE|TIMESTAMP) 不区分大小写的(?i)选项。当您只想搜索创建表和时间戳时

我想在
创建表
中搜索关键字
时间戳
。这是我的正则表达式:

(?i)(\s+|^)CREATE\s+TABLE\s+\[\s*\bdbo\b\s*\]\.\[\w+\]\s*\(\s*((.|\n)*)\bTIMESTAMP
但它在一个查询中搜索createtable,在另一个查询中搜索TIMESTAMP


您能帮助我吗?

当您只想搜索创建表和时间戳时,您可以使用以下简单的正则表达式:

(?i)(CREATE TABLE|TIMESTAMP)

不区分大小写的(?i)选项。

当您只想搜索创建表和时间戳时,可以使用以下简单的正则表达式:

(?i)(CREATE TABLE|TIMESTAMP)
(?i)选项不区分大小写。

您可以使用

(?im)^CREATE\s+TABLE\s+\[\s*dbo\s*\]\.\[\w+\]\s*\(\s*(.*(?:\n(?!CREATE\s+TABLE\b).*)*)\bTIMESTAMP\b

如果正则表达式无法将CR字符与
匹配,请在
\n
之前添加
\r?

注意,
dbo
的两端不需要
\b
单词边界,因为它位于
[…]

详细信息

  • (?im)
    -忽略屏幕上的大小写和多行模式
  • ^
    -行的开头
  • CREATE\s+TABLE\s+\[
    -
    CREATE TABLE[
    在单词之间有1+空格
  • \s*dbo\s*
    -一个
    dbo
    字符串,用0+空格括起来
  • \]\.\[
    -
    ].[
    字符串
  • \w+
    -1+字字符
  • \]
    -
    ]
    char -
    \s*\(\s*
    -a
    用0+空格括起来
  • (.*)(.**:\n(?!CREATE\s+TABLE\b)。*)*)
    -第1组:
    • *
      -除换行符以外的任何0+字符
    • (?:\n(?!CREATE\s+TABLE\b)。*)*
      -0个或多个
      • \n(?!CREATE\s+TABLE\b)
        -换行符后面没有
        CREATE TABLE
      • *
        -除换行符以外的任何0+字符
  • \b时间戳\b
    -一个完整的单词
    时间戳
您可以使用

(?im)^CREATE\s+TABLE\s+\[\s*dbo\s*\]\.\[\w+\]\s*\(\s*(.*(?:\n(?!CREATE\s+TABLE\b).*)*)\bTIMESTAMP\b

如果正则表达式无法将CR字符与
匹配,请在
\n
之前添加
\r?

注意,
dbo
的两端不需要
\b
单词边界,因为它位于
[…]

详细信息

  • (?im)
    -忽略屏幕上的大小写和多行模式
  • ^
    -行的开头
  • CREATE\s+TABLE\s+\[
    -
    CREATE TABLE[
    在单词之间有1+空格
  • \s*dbo\s*
    -一个
    dbo
    字符串,用0+空格括起来
  • \]\.\[
    -
    ].[
    字符串
  • \w+
    -1+字字符
  • \]
    -
    ]
    char -
    \s*\(\s*
    -a
    用0+空格括起来
  • (.*)(.**:\n(?!CREATE\s+TABLE\b)。*)*)
    -第1组:
    • *
      -除换行符以外的任何0+字符
    • (?:\n(?!CREATE\s+TABLE\b)。*)*
      -0个或多个
      • \n(?!CREATE\s+TABLE\b)
        -换行符后面没有
        CREATE TABLE
      • *
        -除换行符以外的任何0+字符
  • \b时间戳\b
    -一个完整的单词
    时间戳

    • 分两步进行可能更容易

      步骤1:找到“complete”
      createtable
      语句。实际上,找到最外层括号的范围

      (?i)(^ *)CREATE\s+TABLE\s+[^()]*\(([^()]*\([^()]*\))*[^()]*\)
      
      测试


      步骤2:在结果中找到的字符串中查找
      时间戳。

      分两步进行可能更容易

      步骤1:找到“complete”
      createtable
      语句。实际上,找到最外层括号的范围

      (?i)(^ *)CREATE\s+TABLE\s+[^()]*\(([^()]*\([^()]*\))*[^()]*\)
      
      测试


      步骤2:在找到的字符串中查找
      时间戳

      请编辑您的问题并显示清晰的示例输入数据(正反两种情况),并告诉我们预期的输出是什么。输入文本中的每个SQL语句后,
      GO
      是否单独出现在一行上?(在您的regex101示例中,它出现在第一条语句之后,但不出现在第二条语句之后--我不知道您在粘贴第二条语句时是否遗漏了它)。看起来您正试图使用regex实现解析器。这是错误的。请使用解析器。它们是两件不同的事情,regex不能单独用于编写正确的解析器(尽管正则表达式lexer可能是解析器的有用组件)。请编辑您的问题并显示清晰的示例输入数据(正反两种情况),同时告诉我们预期的输出是什么。
      GO
      是否在输入文本中的每个SQL语句后单独出现在一行上?(在您的regex101示例中,它出现在第一条语句之后,但不出现在第二条语句之后--我不知道您在粘贴第二条语句时是否遗漏了它)。看起来您正试图使用regex实现解析器。这是错误的。请使用解析器。它们是两件不同的事情,regex不能单独用于编写正确的解析器(尽管正则表达式lexer可能是解析器的有用组件)。我认为,这并没有回答OP的问题。OP似乎在寻找
      CREATE TABLE
      语句中是否出现了
      timestamp
      值。然后我就理解错了。我认为他必须多描述一点他想要实现的目标。如果你看一下提供的regex101示例OP,就会更清楚一些。这并不意味着对于OP的问题,我认为。OP似乎在寻找值
      timestamp
      是否出现在
      CREATE TABLE
      语句中。然后我理解错了。我认为他必须更详细地描述他想要实现的目标。如果你看一下regex101示例,OP会变得更清晰。