2011-12-19 70 views
0

作为输入我有一个简单的SQL查询不便像数找到所有IN子句:正则表达式:与参数大于或等于

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是参数的数量。 显然,第一部分:

^.* 

吃所有,除了最后一个子句的语句。我该如何解决这个问题?任何建议如何改进正则表达式?

+0

更新了问题并修复了一个错字 – WeMakeSoftware 2011-12-19 11:11:31

回答

3

试试这个位置

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

所以,我从你的表情去掉了一些东西,并修正了明显的错误(\(?:,你躲过了错误的支架。

\b是一个字边界。

现在这是为我工作here on Regexr

+0

试过了,但它不起作用。 – WeMakeSoftware 2011-12-19 08:54:57

+0

@Funtik我改变了我的答案,并添加了一个链接到Regexr一个有用的在线测试工具。 – stema 2011-12-19 09:08:37

+0

我在问题中输入了错字,更新了问题 – WeMakeSoftware 2011-12-19 11:12:26

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)'] 

您可能会或可能不会取决于你如何使用这需要周围的正则表达式的额外^.*?.*$

+0

感谢回复和提示 是的,我的解决方案绝不是一个优雅的解决方案。我编辑了问题并修正了关于括号和可选组的错字 – WeMakeSoftware 2011-12-19 11:28:05