【问题标题】:REGEX issue, selecting an sql query with multiple new lines正则表达式问题,选择带有多个新行的 sql 查询
【发布时间】:2015-06-15 14:04:48
【问题描述】:

我正在尝试以 SELECT 开头和 LIMIT 结尾来选择每个查询,例如:

$SelQuery = "SELECT DISTICNT C.firstname,C.lastname,C.id as clientid,QC.category_name,QR.cid,QR.catid,QR.rhid
                    FROM cms_question_report QR, cms_clients C,cms_questioncategory QC ,cms_reporthistory RH
                    WHERE C.id=QR.cid
                    AND QR.rhid=RH.id
                    AND QR.catid='".$objArray['catid']."'
                    AND QR.catid=QC.id
                    AND C.id IN($SelClids)
                    LIMIT $page_no,$this->Limit";

并且不要选择任何其他不包含 LIMIT 的查询。所以我认为可行的正则表达式是这样的:

SELECT .*\n* LIMIT

我基本上是说它必须以“SELECT”开头,然后是任何其他字符并以 LIMIT 结尾,唯一的问题是我不知道如何处理 \n*,我有多个未知数量的新行,每行都有未知字符,所以我假设它应该像这样 \n*.\n.* 等等,但肯定有一种方法可以说选择任何字符,包括换行。

我已尝试使用此解决方案:Regex to match any character including new lines 并将我的正则表达式调整为:

SELECT /s* LIMIT

但效果并不好。

也试过了:

SELECT (.|\n)* LIMIT

但是没有用。

【问题讨论】:

  • 不要用 regexes 解析 SQL。 SQL 是一种递归语言,只能用 上下文无关语法... 正确解析
  • 对不起,我不明白你指的是什么。 SQL 作为一种递归语言与此有什么关系?正则表达式会将其视为纯文本,在任何类型的文本上运行正则表达式都不会产生任何影响。对吗?
  • 您似乎正在处理源代码以提取一些查询。你在用 grep 吗?
  • @1010 我不知道你在说什么,但我在 sublime 中使用这个正则表达式来查找这些查询并在之后替换它们。
  • @NaguibIhab:让我们用一个初始笑话来回答这个问题:“Yo dawg!我听说你喜欢 sql 查询,所以我们在 sql 查询中放置了一个 sql 查询,这样你就可以在查询你查询"...

标签: regex


【解决方案1】:

正如@CommuSoft 评论的那样,SQL 查询的结构无法使用正则表达式正确识别。

但是,如果您只想在源代码中查找所有包含查询的字符串,这些查询以 SELECT 开头并包含单词 LIMIT 并允许在引号之间使用 EOL,您可以使用以下内容:

\"SELECT([^"]|\n|\"[^";]*\")*LIMIT([^"]|\n|\"[^";]*\")*\";

演示here

这个正则表达式将匹配一个用双引号和 SELECT 和 LIMIT 分隔的字符串,并且允许在零个或多个之间

  • 不是双引号的字符
  • \n
  • 一对双引号,其间包含任何字符,但 ;

这可能会满足您的需求,但这取决于您的代码是什么样的。例如,如果您构建查询连接变量,它将不起作用。

请注意,根据操作系统,行尾标记可以是 \r\n 或 \r。

【讨论】:

  • 感谢您的回答。我不明白这个替代方案:\"[^";]*\",据我了解,您正在寻找类似 "" 而不是 "";"我为什么要在查询中寻找这个?
  • @NaguibIhab 您的查询是在双引号和其他表达式之间连接字符串文字构造的。那部分寻找像".$objArray['catid']."这样不能habe的东西;因为它会结束这一行。
  • 请注意,[^";]\n 不匹配,因此包含 \n(即引号外)的连接表达式将不匹配。
  • 感谢您的帮助。
猜你喜欢
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 2015-04-03
相关资源
最近更新 更多