正则表达式:找到所有IN子句的参数数量大于或等于

时间:2011-12-19 08:50:50

标签: regex

作为输入,我有一个简单的SQL查询,如:

select * from (
    select * from Table where id in (1,2,3,4,5,6,642,7,8,9)
        or another_id in (1,2,3,4,5,6, 34 ,7 , 8,9))
where yet_another_id in (1,2)

我想找到所有 IN子句语句,其中传入的参数数量大于XXX。 到目前为止,我已经提出了这个解决方案。

 ^.*\s*+(?:in)+\s*+(\((?:\s*+\d+\s*+\,?+){XXX,}+\){1}).*$

其中XXX是参数的数量。 显然,第一部分:

 ^.*
除了最后一个语句之外,

使用所有IN子句语句。我该如何解决这个问题?有什么建议我如何改进正则表达式?

2 个答案:

答案 0 :(得分:3)

在这里试试

\bin\b\s*(?:\((?:\s*\d+\s*\,?){5,}\))

因此,我从您的表达式中删除了一些内容并修复了一个明显的错误(\(?:,其中您逃过了错误的括号。

\b是一个单词边界。

这对我来说是here on Regexr

答案 1 :(得分:2)

在整个地方,您似乎大量过度使用随机+字符使其复杂化:\s*+表示重复一次或多次0个或多个空格。 \s*就足够了。然后(?:in)+表示您要匹配inininininininininin,这似乎不对。同样,\,?+表示重复一次或多次的可选逗号。

但真正的问题是,在文字\(之后,您?:没有遵循开括号,这意味着\(?:与可选的(匹配,后跟非可选的:。输入中没有任何冒号,因此没有可能的匹配。

尝试这样的事情:

>>> import re
>>> text = '''select * from (
    select * from Table where id in (1,2,3,4,5,6,642,7,8,9)
        or another_id in (1,2,3,4,5,6, 34 ,7 , 8,9))
where yet_another_id in (1,2)'''
>>> re.findall("(?:in)\s*(\((?:[^),]+\,?){10,}\))", text)
['(1,2,3,4,5,6,642,7,8,9)', '(1,2,3,4,5,6, 34 ,7 , 8,9)']

根据您的使用方式,您可能需要或可能不需要额外的^.*?.*$正则表达式。