我正面临一个正面的问题,这个问题让我头疼了几个小时。我正在尝试创建一个regexp,它将返回给定SQL查询中的每个expression = value对。例如:
(YEAR(created) = ? OR YEAR(created) = ?)
我想要两个小组,YEAR(created) = ?
和YEAR(created) = ?
。DATE_FORMAT(col, "%d-%m") = ?
我想要一个小组DATE_FORMAT(col, "%d-%m") = ?
我想我非常接近:https://regex101.com/r/mX7sO8/1。所有的例子对我来说都很好,除了我无法让一个例子正常工作(我想要两个组,而不是一组)。
有人能指出我在正确的方向吗?
答案 0 :(得分:1)
首先检查字母后面是包含任何字符的可选括号,然后是=
和?
尝试以下正则表达式
[`\w]+(?:\([^\(]+\))?\s*=\s*\?
正则表达式解释:
[`\w]+ any character of: '`', word characters (a-z, A-Z, 0-9, _) (1 or more times)
(?: group, but do not capture (optional):
\( '('
[^\(]+ any character except: '\(' (1 or more times)
\) ')'
)? end of grouping
\s* whitespace (\n, \r, \t, \f, and " ") (0 or more times)
= '='
\s* whitespace (\n, \r, \t, \f, and " ") (0 or more times)
\? '?'
答案 1 :(得分:0)
我写的这个似乎与你的测试用例相符(而且我试图让它匹配不在你的测试用例中的有效SQL)
[`\w"]+(\([\w\s,"%-]+\))?\s?=\s?\?
https://regex101.com/r/lF9hZ4/1
让我们快点分解
[`\w"]+
任何一个或多个字母,反引号(`)或引号(“)
(\([\w\s,"%-]+\))?
后跟一个可选组:可选括号\(
,后跟一个或多个字母,空格字符,逗号(,),百分号(%)或超级( - ){{1} },后跟另一个可选括号[\w\s,"%-]+
。
\)
后面跟一个等于(=)的符号,可选择用空格包围
\s?=\s?
后跟一个问号
答案 2 :(得分:0)
您遇到的问题是.+
中的\w+\(.+\)
匹配太多了。看到这一点的诀窍是删除?:
以捕获第一个组,以便regex101可以向您显示它已捕获YEAR(created) = ? OR YEAR(created)
(.+
对应于created) = ? OR YEAR(created
)。解决方案只是在?
之后添加.+
,使其变得懒惰而不是贪婪。
您的解决方案非常复杂,并且涉及太多特殊情况,尤其是在开始时。也许你会更好地分析OR
等运营商?