如何使用正则表达式突出显示SQL关键字?

问题描述 投票:1回答:3

我想在语法荧光笔中突出显示字符串中出现的SQL关键字。这是我想要的规则:

  • 匹配关键字SELECT和FROM(将添加其他关键字,但我们将从此处开始)。必须全部大写
  • 必须包含在字符串中-以'"开头
  • 该字符串中的第一个单词(忽略其前面的空格)应该是关键字之一。

这当然不是全面的(可以忽略字符串中的转义符,但是我想从这里开始。

以下是一些示例:

  • SELECT * FROM main-不匹配(不在字符串中)
  • SELECT名称FROM main”-将匹配
  • SELECT名称FROM main“-将匹配
  • “”“这是一条SQL语句:

SELECT * FROM main“”“-不,字符串不是以关键字开头(SELECT ...)。

我想在单个正则表达式中执行此操作的唯一方法是在后面留负数...但是由于它不固定宽度,因为我们不知道字符串何时开始。类似于:

但是这当然不起作用:

(?<=["']\s*(SELECT)\s*)(SELECT|FROM)

是否可以在单个正则表达式中执行类似的操作?

sql regex parsing syntax
3个回答
1
投票

合适的正则表达式可能会变得相当复杂,尤其是随着规则的进一步发展。正如其他人指出的那样,可能值得考虑使用解析器。就是说,这是一种可能的正则表达式,试图覆盖到目前为止提到的规则:

enter image description here

“正则表达式可视化”“>

在线演示
  1. (["'])\s*(SELECT)(?:\s+|\s.*\s)(FROM)(?:\s+.*)?\1(?:[^\w]|$)

  • Debuggex Demo
  • 说明

    如以上可视化所示,正则表达式在开头查找双引号或单引号(保存在捕获组#1中,然后在末尾通过Regex101 Demo匹配此引用。 \1SELECT关键字在捕获组#2和#3中捕获。 ((FROM语法确保没有更多的组可用于其他选择,因为在选项开始时?:(x|y)将其排除为捕获组。]还有一些其他可选的详细信息,例如限制允许的内容在?:SELECT之间,并且如果后面紧跟一个单词字符,则不计算最后的引号。

    结果
    FROM


    0
    投票

    您可以使用捕获组:


    0
    投票

    仅测试了正则表达式的波纹管:

    © www.soinside.com 2019 - 2024. All rights reserved.