2

我编写了一个 RegExp 来捕获 SQL (JDBC) 查询的所有参数和关联值。

我正在使用这个。

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

你能帮我解决这个问题吗?如果需要,我可以使用两个表达式。

4

2 回答 2

1

我认为您可以在第二组中打开有效字符的范围。我还写了您的操作员列表中的所有选项。

演示链接

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

这将符合您所要求的一切。

新演示

于 2017-05-05T06:49:00.693 回答
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

于 2017-05-05T06:56:42.413 回答