我需要解析简单的查询构造 可能的选择
select col1,col2
select col1,col2 where col1=1 and col2 = 'title'
select col1,col2 where col1=1 and col2 = 'title' order by col1
select col1,col2 order by col1
我有以下正则表达式
(select-?.*?)\s+(.*?){0,1}(?:\s+(where-?.*?)(.*)){0,1}\s(order by-?.*?){0,1}\s{0,1}
但在我的情况下它的作用很奇怪
我希望order by
在第5组,但在我的情况下,它是第4组的一部分。我希望有以下顺序
select
字where
字 - 是可选的order by
字 - 可选那么,有人能指出我,我做错了吗?
答案 0 :(得分:1)
问题在于第4组:(.*)
贪婪.*
吃掉整条线。正则表达式必须回溯以匹配\s
,col1
之前的空格是右边的第一个空格,因此匹配。所有其他组都是可选的,因此正则表达式已完成。
编辑:好的,你也想要一个正则表达式......
此正则表达式适用于所有输入(可能需要调整):
^(select-?[^\n]*?)(\s+[^\n]*?)?(?:\s+(where-?[^\s]*\s)([^\n]*?))?\s(?:(order\s*by-?\s)([^\n]*))?$
将其与mg
修饰符一起使用。
它基于你的正则表达式松散,但如果需要,我可以解释它。
为方便起见,这里是与命名组相同的正则表达式(需要mgx
修饰符):^(?'select'select-?[^\n]*?)
(?'col'\s+[^\n]*?)?
(?:\s+(?'where'where-?[^\s]*\s)
(?'cond'[^\n]*?))?\s
(?:(?'order'order\s*by-?\s)(?'by'[^\n]*))?$