在括号内匹配文本*而不是*的正则表达式

时间:2012-01-11 16:01:22

标签: php sql regex

我正在寻找一个与PHP(PCRE)兼容模式中的所有粗体文本匹配的正则表达式,这只是一个需要匹配的示例查询,所以它不能如此具体以至于它赢了不能处理其他类似的查询。

  

选择 a。*,(从table1中选择count(*))为t1,(选择   来自table2的count(*)为t2,(从table3中选择count(*))为t3,   来自table4的col1,col2 作为LEFT JOIN(SELECT g2。*,g1.id来自   table5)as g ON(a.id = g.id));

更新:我的想法是匹配任何括号和之前的所有内容之间的单词FROM。最终目标是用数据库抽象层的“COUNT()”替换所有粗体文本。

2 个答案:

答案 0 :(得分:1)

如果您的问题是“我如何使用正则表达式来查找在SQL查询的顶级中选择的表达式”,那么简短的答案是,您不能。

SQL 不是“常规语言”(任何允许嵌套括号的语言都没有),所以你就被阻止了。我相信它是一个上下文敏感的语法,所以你需要一个单独的词法分析器和解析器。

答案 1 :(得分:1)

这个问题你不需要正则表达式。

简单地遍历所有角色并跟踪您的嵌套级别。当您检测到左括号时,将嵌套级别增加1.当您检测到右括号时,将嵌套级别减1.当您找到单词“from”时,如果嵌套级别为0,则标记位置(并返回从开头到那个位置的子串),否则忽略它并继续前进。

在查询无效的情况下,这将是脆弱的,但如果已知查询有效,则它应该有效。