Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要在SQL字符串的值中查找的RegExp_Sql_Regex_Jdbc_Sql In - Fatal编程技术网

要在SQL字符串的值中查找的RegExp

要在SQL字符串的值中查找的RegExp,sql,regex,jdbc,sql-in,Sql,Regex,Jdbc,Sql In,我编写了一个RegExp来捕获SQLJDBC查询的所有参数和关联值 我正在用这个 (?:\S+\s)?\S*"myOperatorHere\S*(?:\s\S+)? 这样我就可以捕获如下参数:其中c.value=32 我可以得到c值和32 它与所有操作员都能很好地工作,除了在 我想知道c值在3,4,5,6中的位置 但是通过这个表达式,我得到了3,作为一个值,而不是3,4,5,6 例如,如果我有查询: SELECT C.NAME, C.FIRSTNAME FROM CUSTOMER C, PRO

我编写了一个RegExp来捕获SQLJDBC查询的所有参数和关联值

我正在用这个

(?:\S+\s)?\S*"myOperatorHere\S*(?:\s\S+)?
这样我就可以捕获如下参数:其中c.value=32

我可以得到c值和32

它与所有操作员都能很好地工作,除了在

我想知道c值在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.trc=28,p.ID<12,p.A在2,3,4中


你能帮我处理一下吗?如果需要,我可以使用两个表达式。

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

模式分解:

(?:                 #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+)
这将符合你所要求的一切


我相信,你实际上对这样的输入有问题,3,4,5,6中的c.value注意逗号后面的空格

如果是这样的话,我建议使用两种模式,一种用于标量值,另一种用于列表,并使用更改匹配其中任何一种。后者可以定义为由逗号和一些可选空格分隔的非空格序列,以及由括号包围的整个列表,即.\s*\s+\s*?:,\s*\s+\s**\。整个正则表达式:

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

演示:

谢谢你的工作。但我在问题描述中添加的SQL示例并不适用,这很好。非常非常感谢,谢谢。当in值中没有空格时,此选项有效。我在用=或<或@Gilles:oops,我的错,对不起。备选方案应先有列表,然后是\S+。修正了答案。非常感谢
(?:\S+\s)?\S*"myOperatorHere\S*(?:\s(?:\(s*\S+\s*(?:,\s*\S+\s*)*\)|\S+))?