我想在语法荧光笔中突出显示字符串中出现的SQL关键字。这是我想要的规则:
'
或"
开头这当然不是全面的(可以忽略字符串中的转义符,但是我想从这里开始。
以下是一些示例:
SELECT * FROM main“”“-不,字符串不是以关键字开头(SELECT ...)。
我想在单个正则表达式中执行此操作的唯一方法是在后面留负数...但是由于它不固定宽度,因为我们不知道字符串何时开始。类似于:
但是这当然不起作用:
(?<=["']\s*(SELECT)\s*)(SELECT|FROM)
是否可以在单个正则表达式中执行类似的操作?
合适的正则表达式可能会变得相当复杂,尤其是随着规则的进一步发展。正如其他人指出的那样,可能值得考虑使用解析器。就是说,这是一种可能的正则表达式,试图覆盖到目前为止提到的规则:
“>
(["'])\s*(SELECT)(?:\s+|\s.*\s)(FROM)(?:\s+.*)?\1(?:[^\w]|$)
如以上可视化所示,正则表达式在开头查找双引号或单引号(保存在捕获组#1中,然后在末尾通过Regex101 Demo匹配此引用。 \1
和SELECT
关键字在捕获组#2和#3中捕获。 ((FROM
语法确保没有更多的组可用于其他选择,因为在选项开始时?:(x|y)
将其排除为捕获组。]还有一些其他可选的详细信息,例如限制允许的内容在?:
和SELECT
之间,并且如果后面紧跟一个单词字符,则不计算最后的引号。
FROM
您可以使用捕获组:
仅测试了正则表达式的波纹管: