首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从本机sql表达式(regex)获取参数名称列表

从本机sql表达式(regex)获取参数名称列表
EN

Stack Overflow用户
提问于 2022-09-26 08:40:46
回答 1查看 45关注 0票数 0

我在使用Regex获取SQL查询中的所有参数列表时遇到了问题。

查询示例:

代码语言:javascript
运行
复制
SELECT ... WHERE col1 = :user AND col2 = 'HELLO' OR col3 = :language

要获得参数,我使用以下regex模式:

代码语言:javascript
运行
复制
Pattern.compile(":([\\w.$]+|\"[^\"]+\"|'[^']+')", Pattern.MULTILINE)

模式正确地返回参数列表:

代码语言:javascript
运行
复制
:user
:language

问题在于另一种类型的查询,其中文字可能包含字符“:”。

代码语言:javascript
运行
复制
WHERE col1 = :user AND some_date > '2022-09-26T10:22:55'

这种情况的参数列表是:

代码语言:javascript
运行
复制
:user
:22
:55

有什么更好的方法不把文字的内容当作参数吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-26 08:59:33

您可以简化您的问题,假设sql中命名的param只是一个前缀:的单词,并且总是在空格后面(这实际上不是一个要求,或者总是正确的,但可能足够好,只要使用尽可能简单的正则表达式就可以得到可接受的结果)。

代码语言:javascript
运行
复制
Pattern.compile(" :\\w+", Pattern.MULTILINE)

--

评论摘要:

代码语言:javascript
运行
复制
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)

最后,这种具有固定长度前瞻性和可变长度后视的正则表达式非常有用:

代码语言:javascript
运行
复制
 Pattern.compile("(?<=[=(])\\s*:[\\w_.]+|:[\\w_.]+(?=\s*[=)])", Pattern.MULTILINE)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73851560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档