2017-05-05 195 views
2

我已经编写了一个RegExp来捕获SQL(JDBC)查询的所有参数和关联值。RegExp查找SQL字符串的IN值

我正在使用这个。

(?:\S+\s)?\S*"myOperatorHere\S*(?:\s\S+)? 

所以,我可以赶上参数,如:Where c.value = 32

我能得到c.value32

它与所有的运营商运作良好,除了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)

能否请你帮我管理这个?如果需要,我可以使用两个表达式。

回答

1

我认为你可以打开第二组中有效字符的范围。 我也写过您的运营商列表中的所有选项。

Demo Link

(?:\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 

编辑:我是能够削减一些步骤和人物离我的模式,而不会损坏输出:

\S+ (?:IN|[<=>]+) (?:\([^)]+?\)|\S+) 

这将匹配你所要求的一切。

New Demo

+0

由于几乎工作。但不是用我已经添加到问题描述 – Gilles

+0

的SQL示例。这很棒。非常感谢你 – Gilles

0

我相信,你确实有这样的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+))? 

演示:https://regex101.com/r/YUtuty/1

+0

谢谢。当IN值中没有空格时,这个工作。 myoperator:我正在使用=或<或<= ...或IN。我们如何增加在IN中有空格的可能性?IN(2,3,4) – Gilles

+0

@Gilles:哎呀,我的坏,对不起。在此之后,交替应该有列表和'\ S +'。修复了答案。 –

+0

非常感谢 – Gilles