首页 文章

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

提问于
浏览
-1

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

选择a . ,(从table1中选择count())为t1,(从table2中选择count())为t2,(从table3中选择count())为t3,col1,col2,table4为LEFT JOIN(从表5中选择g2 . *,g1.id)为g ON(a.id = g.id));

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

2 回答

  • 1

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

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

  • 1

    你不需要正则表达式来解决这个问题 .

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

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

相关问题