作为输入,我有一个简单的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子句语句。我该如何解决这个问题?有什么建议我如何改进正则表达式?
答案 0 :(得分:3)
在这里试试
\bin\b\s*(?:\((?:\s*\d+\s*\,?){5,}\))
因此,我从您的表达式中删除了一些内容并修复了一个明显的错误(\(?:
,其中您逃过了错误的括号。
\b
是一个单词边界。
这对我来说是here on Regexr
答案 1 :(得分:2)
在整个地方,您似乎大量过度使用随机+
字符使其复杂化:\s*+
表示重复一次或多次0个或多个空格。 \s*
就足够了。然后(?:in)+
表示您要匹配in
或ininininininininin
,这似乎不对。同样,\,?+
表示重复一次或多次的可选逗号。
但真正的问题是,在文字\(
之后,您?:
没有遵循开括号,这意味着\(?:
与可选的(
匹配,后跟非可选的:
。输入中没有任何冒号,因此没有可能的匹配。
尝试这样的事情:
>>> 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)']
根据您的使用方式,您可能需要或可能不需要额外的^.*?
和.*$
正则表达式。