当前位置: 首页 > 知识库问答 >
问题:

使用正则表达式解析SQL,不包括引用的文字

阎星河
2023-03-14

对于我的DBAL,我需要解析提供SQL[mysql方言,特别是]字符串来查找所有占位符。

但是,当然,我不想解析任何类似占位符的组合,这些组合偶尔可能出现在带引号的文本中——单引号、双引号或反引号。

说,这可能是

SELECT amount as `Amount: boxes` FROM t WHERE q='howdy?' and a='I\'m OK' and category=?

只有最后一个问号是唯一实际的占位符

给定大量的转义规则,其中一些规则取决于当前的DB设置(NO_BACKSLASH_ESCAPESANSI_QUOTES等),这可以将上述查询转换为

SELECT amount as "Amount:boxes" FROM t WHERE q='howdy?' and a='I''m OK' and category=?

我怀疑这项任务是否可行。

但是,我仍然希望它能够完成,甚至可能是有人手头有解决方案。

共有1个答案

韩玉石
2023-03-14

您要寻找的一般模式是/string(*SKIP)(*F)|\? /其中string是匹配字符串的正则表达式。我不太熟悉SQL字符串语法。一些建议:

  • 带有反斜杠转义的单引号:'[^'\\]*(?:\\.[^'\\]*)*'
  • 单引号与引号重复转义:'[^']*(?:''[^']*)*'

例如,单引号、双引号和反斜线以及重复转义的完整正则表达式如下所示:

/(?:
    '[^'\\]*(?:(?:\\.|'')[^'\\]*)*'
  | "[^"\\]*(?:(?:\\.|"")[^"\\]*)*"
  | `[^`\\]*(?:(?:\\.|``)[^`\\]*)*`
 )(*SKIP)(*F)| \?
/x

根据您的需要,使用< code>preg_match_all或< code > preg _ replace _ callback 进行匹配。

注意:为了避免额外的转义,请将正则表达式放在NOWDOC字符串中。

 类似资料:
  • 问题内容: 是否有单个正则表达式可以解析表示简单布尔运算的字符串(在Python和/或Javascript中,不必是同一表达式)?例如我想解析这个字符串: 假定: 括号不嵌套 术语a,b,…,z不是子表达式 生成的捕获应首先按括号分组,然后再使用相同或更简单的正则表达式对其进行解析。 我已经成功地编写了一个天真的正则表达式来解析不带括号的布尔运算。 有任何想法吗? 问题答案: 通常,您将使用递归下

  • 我试图在正则表达式中组合if-else,基本上,如果字符串中存在一些模式,则捕获一个模式,如果不存在,则捕获另一个模式。 字符串是:'https://www.searchpage.com/searchcompany.aspx?companyId=41490234 因此,如果在字符串中检测到“?”,则正则表达式应捕获“?”标记之后的所有内容;如果没有,那就从头抓起。 我使用了:

  • 我想将带有嵌套大括号的原始字符串解析为多维数组。下面我添加了一些有效的示例代码。但主要问题是,我的正则表达式只捕获第一个匹配的组,而忽略了另一个发生。 非常感谢您的帮助。 代码: 原始字符串(data.txt): 代码输出: 但例外输出:

  • 问题内容: 我正在寻找一种解析日志文件的解决方案。看起来像: 可以区分以下元素: 但我仍然不知道该怎么做。简单行不通。 我知道正则表达式具有一般规则,但最合适的是Java。 谢谢 问题答案: 我想出了一种根据可能的/期望的值从与各个字段匹配的块中构建正则表达式的方法。 当然,可以用rex代替rexa或rexi。

  • 问题内容: 我想使用Regex解析Java中的插入查询。 以下是示例字符串 我想要以下输出: 我已经尝试过以下正则表达式: 输出是 请帮助我如何获得期望的结果。 问题答案: 您可以尝试以下正则表达式: 解释: 比赛之间和 比赛之间和 这是一个示例代码: 输出如下:

  • Java中的正则表达式问题。我正在从元素href属性中提取Id号。我在一个字符串中有一堆这样的链接: