我正在寻找一个与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()”替换所有粗体文本。
答案 0 :(得分:1)
如果您的问题是“我如何使用正则表达式来查找在SQL查询的顶级中选择的表达式”,那么简短的答案是,您不能。
SQL 不是“常规语言”(任何允许嵌套括号的语言都没有),所以你就被阻止了。我相信它是一个上下文敏感的语法,所以你需要一个单独的词法分析器和解析器。
答案 1 :(得分:1)
这个问题你不需要正则表达式。
简单地遍历所有角色并跟踪您的嵌套级别。当您检测到左括号时,将嵌套级别增加1.当您检测到右括号时,将嵌套级别减1.当您找到单词“from”时,如果嵌套级别为0,则标记位置(并返回从开头到那个位置的子串),否则忽略它并继续前进。
在查询无效的情况下,这将是脆弱的,但如果已知查询有效,则它应该有效。