【问题标题】:Parse simple query construction using regex使用正则表达式解析简单的查询构造
【发布时间】:2016-04-24 18:17:37
【问题描述】:

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

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 组的一部分。我想要以下订单

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

那么,有人可以指出我做错了什么吗?

【问题讨论】:

  • 图片中的正则表达式不是代码中的。
  • 是解释模式的问题还是寻求帮助来修复它?
  • 正则表达式一种语言的语法要简单得多。 SQL 是一种语言(如 HTML !!),通常不能被正则表达式识别;相反,它必须由语法解析。一个非常简单的 Recursive Descent Parser 应该足以满足您的任务;并且应该在每个称职的程序员的工具带上。
  • 对了,{0,1}可以换成?

标签: sql regex


【解决方案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]*))?$

【讨论】:

  • 那么,在我的情况下应该如何?
  • @IvanUrsul 什么正则表达式的味道? JS?
  • @IvanUrsul 我还是写了一个正则表达式
猜你喜欢
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多