使用正则表达式解析简单查询构造

时间:2016-04-23 09:53:00

标签: sql regex

我需要解析简单的查询构造 可能的选择

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}

但在我的情况下它的作用很奇怪

enter image description here

我希望order by在第5组,但在我的情况下,它是第4组的一部分。我希望有以下顺序

  • 第1组 - select
  • 组#2 - 列字符串
  • 第3组 - where字 - 是可选的
  • 第4组 - 条件字符串 - 可以是可选的(如果不存在)
  • 第5组 - order by字 - 可选
  • 第6组 - 订单列表 - 是可选的(如果目前没有订单)

那么,有人能指出我,我做错了吗?

1 个答案:

答案 0 :(得分:1)

问题在于第4组:(.*)

贪婪.*吃掉整条线。正则表达式必须回溯以匹配\scol1之前的空格是右边的第一个空格,因此匹配。所有其他组都是可选的,因此正则表达式已完成。

编辑:好的,你也想要一个正则表达式......

此正则表达式适用于所有输入(可能需要调整): ^(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]*))?$