【问题标题】:Regex that matches text *not* between brackets匹配括号之间的文本 *not* 的正则表达式
【发布时间】:2012-01-11 16:01:21
【问题描述】:

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

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

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

【问题讨论】:

  • 不确定是否可以使用正则表达式,因为您有嵌套查询。
  • 鉴于您的 SELECT 的嵌套性质,这将很难。
  • 要做到这一点,我们需要知道粗体部分与非粗体部分相比有什么特别或独特之处,尤其是在它们相遇的地方——否则你对“如此具体”的规定"使这成为不可能。例如,应该只包含前三个表,还是到指定列的第一个表...?
  • 你能再具体一点吗?您提供的示例与您的问题的标题不匹配。它是哪一个:粗体文本,或不在括号内的文本(这到底是什么意思)?
  • @Miky - 编辑删除了文本中的粗体

标签: php sql regex


【解决方案1】:

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

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

这在查询无效的情况下会很脆弱,但如果已知查询有效,它应该可以工作。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      相关资源
      最近更新 更多