返回给定字符串的每个表达式=值对

时间:2016-03-23 17:36:44

标签: regex

我正面临一个正面的问题,这个问题让我头疼了几个小时。我正在尝试创建一个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。所有的例子对我来说都很好,除了我无法让一个例子正常工作(我想要两个组,而不是一组)。

有人能指出我在正确的方向吗?

3 个答案:

答案 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)
  \?             '?'

DEMO

答案 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等运营商?