用于查找 SQL 字符串的 IN 值的正则表达式
RegExp to find IN values of a SQL string
我编写了一个 RegExp 来捕获 SQL (JDBC) 查询的所有参数和关联值。
我正在使用这个。
(?:\S+\s)?\S*"myOperatorHere\S*(?:\s\S+)?
这样我就可以捕获如下参数:Where c.value = 32
我可以得到 c.value
和 32
它适用于除 IN
之外的所有运算符
我想赶上where c.value IN (3,4,5,6)
但是使用这个表达式我得到 (3,
作为值而不是 (3,4,5,6)
例如,如果我有查询:
SELECT C.NAME, C.FIRSTNAME FROM CUSTOMER C, PROSPECT P WHERE C.ID = 32 AND C.TRUC = 28 AND P.ID < 12 AND P.A IN (2, 3, 4)
我想要C.ID = 32, C.TRUC = 28, P.ID < 12, P.A IN (2, 3, 4)
你能帮我处理一下吗?如果需要,我可以使用两个表达式。
我觉得你可以把第二组的有效字符范围放开。
我还写了您的操作员列表中的所有选项。
(?:\S+\s)?\S*(?:IN|[<=>]+)\s(?:(?:\([^)]+\))|\S+)
模式分解:
(?: #non-capture group
\S+\s #1 or more non-white characters then a white character
)? #end non-capture group, zero or one occurrence of the group
\S* #zero or more non-white characters
(?: #non-capture group
IN|[<=>]+ #literally match "IN" or one or more of any operator symbols in range
) #end non-capture group
\s #whitespace character
(?: #non-capture group
(?: #non-capture group
\([^)]+\) #open parenthesis, anything not a close parathensis, close parenthesis
) #end non-capture group
| #or
\S+ #one or more non-whitespace characters
) #close non-capture group
编辑:我能够 trim 从我的模式中删除一些步骤和字符而不损坏输出:
\S+ (?:IN|[<=>]+) (?:\([^)]+?\)|\S+)
这将匹配您所要求的一切。
我相信,您确实对这样的输入有问题 where c.value IN (3, 4, 5, 6)
(注意逗号后的空格)。
如果是这样,我建议使用两种模式,一种用于标量值,一种用于列表,并使用更改来匹配其中任何一种。后者可以定义为由逗号和可选的一些空格分隔的非空格序列,以及由括号包围的整个列表,即 \(s*\S+\s*(?:,\s*\S+\s*)*\)
。以及整个正则表达式:
(?:\S+\s)?\S*"myOperatorHere\S*(?:\s(?:\(s*\S+\s*(?:,\s*\S+\s*)*\)|\S+))?
我编写了一个 RegExp 来捕获 SQL (JDBC) 查询的所有参数和关联值。
我正在使用这个。
(?:\S+\s)?\S*"myOperatorHere\S*(?:\s\S+)?
这样我就可以捕获如下参数:Where c.value = 32
我可以得到 c.value
和 32
它适用于除 IN
我想赶上where c.value IN (3,4,5,6)
但是使用这个表达式我得到 (3,
作为值而不是 (3,4,5,6)
例如,如果我有查询:
SELECT C.NAME, C.FIRSTNAME FROM CUSTOMER C, PROSPECT P WHERE C.ID = 32 AND C.TRUC = 28 AND P.ID < 12 AND P.A IN (2, 3, 4)
我想要C.ID = 32, C.TRUC = 28, P.ID < 12, P.A IN (2, 3, 4)
你能帮我处理一下吗?如果需要,我可以使用两个表达式。
我觉得你可以把第二组的有效字符范围放开。 我还写了您的操作员列表中的所有选项。
(?:\S+\s)?\S*(?:IN|[<=>]+)\s(?:(?:\([^)]+\))|\S+)
模式分解:
(?: #non-capture group
\S+\s #1 or more non-white characters then a white character
)? #end non-capture group, zero or one occurrence of the group
\S* #zero or more non-white characters
(?: #non-capture group
IN|[<=>]+ #literally match "IN" or one or more of any operator symbols in range
) #end non-capture group
\s #whitespace character
(?: #non-capture group
(?: #non-capture group
\([^)]+\) #open parenthesis, anything not a close parathensis, close parenthesis
) #end non-capture group
| #or
\S+ #one or more non-whitespace characters
) #close non-capture group
编辑:我能够 trim 从我的模式中删除一些步骤和字符而不损坏输出:
\S+ (?:IN|[<=>]+) (?:\([^)]+?\)|\S+)
这将匹配您所要求的一切。
我相信,您确实对这样的输入有问题 where c.value IN (3, 4, 5, 6)
(注意逗号后的空格)。
如果是这样,我建议使用两种模式,一种用于标量值,一种用于列表,并使用更改来匹配其中任何一种。后者可以定义为由逗号和可选的一些空格分隔的非空格序列,以及由括号包围的整个列表,即 \(s*\S+\s*(?:,\s*\S+\s*)*\)
。以及整个正则表达式:
(?:\S+\s)?\S*"myOperatorHere\S*(?:\s(?:\(s*\S+\s*(?:,\s*\S+\s*)*\)|\S+))?