我在使用Regex获取SQL查询中的所有参数列表时遇到了问题。
查询示例:
SELECT ... WHERE col1 = :user AND col2 = 'HELLO' OR col3 = :language要获得参数,我使用以下regex模式:
Pattern.compile(":([\\w.$]+|\"[^\"]+\"|'[^']+')", Pattern.MULTILINE)模式正确地返回参数列表:
:user
:language问题在于另一种类型的查询,其中文字可能包含字符“:”。
WHERE col1 = :user AND some_date > '2022-09-26T10:22:55'这种情况的参数列表是:
:user
:22
:55有什么更好的方法不把文字的内容当作参数吗?
发布于 2022-09-26 08:59:33
您可以简化您的问题,假设sql中命名的param只是一个前缀:的单词,并且总是在空格后面(这实际上不是一个要求,或者总是正确的,但可能足够好,只要使用尽可能简单的正则表达式就可以得到可接受的结果)。
Pattern.compile(" :\\w+", Pattern.MULTILINE)--
评论摘要:
had to match
- foo = :param AND :param = bar AND foo=:param AND :param=bar
- AND FUNC(:param) OR FUNC(0, :param) OR FUNC(:param, 0)最后,这种具有固定长度前瞻性和可变长度后视的正则表达式非常有用:
Pattern.compile("(?<=[=(])\\s*:[\\w_.]+|:[\\w_.]+(?=\s*[=)])", Pattern.MULTILINE)https://stackoverflow.com/questions/73851560
复制相似问题