这是关于 从两个 OR 字中的第一个开始的工作正则表达式匹配会采用不需要的最后一个 OR 字,而不是如果我在它之前放置更多正则表达式[重复]。感谢此用户和此用户在该问题下的有用评论。
我得到了:
"(?>=SELECT\s+|,\s*)(.+)\s+AS\s+Error.*?(?<=WHERE|HAVING)(.*)"
或者没有任何环视:
"(?:=SELECT\s+|,\s*)(.+?)\s+AS\s+Error.*?((?:WHERE|HAVING).*)"
作为所需的正则表达式:
SELECT a, bc d AS Error FROM y WHERE 1=1 HAVING 1=1
分为两个匹配组:
bc d
作为构建名为“Error”的列的代码。这是虚拟代码,不用关心 SQL。
“WHERE”或“HAVING”两个词之一之后的任何内容。
参见 Regex101。
然而,在使用 www.regex101.com 的默认语言和风格(在撰写本文时为
PCRE2 (PHP >=7.3)
)测试了所有内容后,它在 MS Access VBA 中不起作用,它会抛出任何带有环视的模式:
Microsoft Visual Basic - 运行时错误“5017”:应用程序定义或对象定义的错误。
环顾四周:
regexPattern = "(?>=SELECT\s+|,\s*)(.+)\s+AS\s+Error.*?(?<=WHERE|HAVING)(.*)" '-> error 5017 pop up
regexPattern = "(?<=WHERE|HAVING)(.*)" '-> error 5017 pop up
regexPattern = "(?>=SELECT\s+|,\s*)(.+)\s+AS\s+Error.*" '-> error 5017 pop up
没有环视,它似乎可以在 MS Access 中工作:
regexPattern = "(?:=SELECT\s+|,\s*)(.+?)\s+AS\s+Error.*?((?:WHERE|HAVING).*)" ' -> no error 5017, but no matches either
regexPattern = "((?:WHERE|HAVING).*)" '-> working
regexPattern = "(?:=SELECT\s+|,\s*)(.+?)\s+AS\s+Error" '-> working
我在更大的 SQL 上进行了测试,发现
(?:=SELECT\s+|,\s*)(.+?)\s+AS\s+Error.*?((?:WHERE|HAVING).*)
再次没有匹配项,并且 Regex101 中也没有匹配项。我需要一个正则表达式,它可以找到如上所示的两个匹配项,并在 order by
之前停止,并且可以在 MS Access VBA 中工作:
SELECT test1.col1, test1.col2, test1.col3, test1.col4, "aaa" AS Error INTO test2
FROM test1
WHERE (((test1.col2)="S") AND ((test1.col4)="bbb")) OR (((test1.col2)="S") AND ((test1.col4)="ccc")) OR (((test1.col2)="S") AND ((test1.col4) Is Null))
HAVING 1=1
ORDER BY test1.col2;
在 MS Access VBA 中工作的正则表达式是什么
Error
没有 AS Error
尾部的列定义,WHERE
/HAVING
子句,从两者中最早的一个开始,ORDER BY
之前停止?由于它是 MS Access VBA,因此看起来不允许前瞻和后瞻。
所需的正则表达式是:
(?:(?:=SELECT\s+|,\s*)([^,]+?)\s+AS\s+Error[\s\S]*?)?(?:((?:WHERE|HAVING)[\s\S]*)?)(?:ORDER.*)
参见https://regex101.com/r/86VUKs/1
第 1 组:
"aaa"
第 2 组:
WHERE (((test1.col2)="S") AND ((test1.col4)="bbb")) OR (((test1.col2)="S") AND ((test1.col4)="ccc")) OR (((test1.col2)="S") AND ((test1.col4) Is Null))
还需要使用
[\s\S]
而不是 .
来抓取换行符。
如果我将
WHERE
更改为 abcd
,则会发现 HAVING
子句如下:
如果我也将
HAVING
更改为 abcd
,则什么也找不到,并且该模式可以处理该问题:
如果我现在也将
Error
更改为 abcd
,则该模式不再找到任何组:
参见 Regex101 这是如何工作的。它也适用于 MS Access。