MS Access VBA 无法处理环视。需要双早/晚正则表达式匹配。 “运行时错误‘5017’:应用程序定义或对象定义的错误”

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

这是关于 从两个 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

分为两个匹配组:

  1. bc d
    作为构建名为“Error”的列的代码。这是虚拟代码,不用关心 SQL。

  2. “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
      子句,从两者中最早的一个开始,
  • 如果 SQL 代码没有所需的关键字,则允许两个或两个匹配项之一根本不存在,
  • 不在换行符处停止,
  • 并在
    ORDER BY
    之前停止?

由于它是 MS Access VBA,因此看起来不允许前瞻和后瞻。

regex vba ms-access
1个回答
1
投票

所需的正则表达式是:

(?:(?:=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。

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