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

提取SQL查询的正则表达式

苏野
2023-03-14

有从字符串中提取SQL查询的正则表达式吗?我不想验证任何SQL语法,而是只想提取一组SQL命令。这是为了以灵活的方式解析给定的SQL文件/字符串。

给出了以下SQL文件/字符串示例:

SELECT
    *
FROM
    test_table
WHERE
    test_row = 'Testing ; semicolon';

SELECT * FROM another_test_table;

INSERT INTO 
    table_name 
VALUES 
    (value1,'value which contains semicolon ;;;;',value3,...);

一些伪代码示例是:^(UPDATESELECTINSERT INTO)(.*)(;)$。在将来,我希望用所有(可能的)命令来扩展它。

  • 查找具有以下任一项的起始匹配:(UPDATESELECTINSERTINTO)
  • 零个或多个任意字符(包括空格和换行符)
  • 停止在处,它分隔SQL查询。

只要通过正则表达式可以这样做,以下Java代码就能够提取所有SQL命令:

final String regex = "LOOKING_FOR_THIS_ONE";
final Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = p.matcher(content);

while (matcher.find()) {
  // matcher.group() now contains the full SQL command
}

提前道谢!

共有2个答案

何超英
2023-03-14

只要分号是该行上最后一个非空格字符,您就可以“适当地”匹配它。

final String regex = ^(SELECT|UPDATE|INSERT)[\s\S]+?\;\s*?$

final Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = p.matcher(content);
许亦
2023-03-14

首先,我会说这不是一个好的方法,并强烈敦促你找到另一种方法,最好是在陈述的地方适当地标记,这样你就不会在这种情况下结束了。

话虽如此,SQL要求它以以下内容之一开始;删除,选择,使用,更新插入。它还要求输入以结尾。

我们可以利用这一点来抓取所有与SQL匹配的序列:

final String regex = "^(INSERT INTO|UPDATE|SELECT|WITH|DELETE)(?:[^;']|(?:'[^']+'))+;\\s*$";
final Pattern p = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL);

组1现在保存操作字,以防您希望在updateselect上筛选有效的SQL。

请参阅正则表达式的作用,以及一个洞穴-在这里:

https://regex101.com/r/dt9xtk/2

 类似资料:
  • 问题内容: 我的数据库中有Markdown格式的文本。我想提取链接并计算我拥有的匹配链接的数量。我可以使用类似于以下的查询来获取包含链接的文本块的列表: 但是,如何进行下一步,仅提取文本的链接部分(括号中的部分)?如果可以得到,则可以计算此特定链接在我的数据集中的次数。 一些样本数据: 我正在使用SQL Server 2012(如果这方面的版本之间存在差异)。 问题答案: 假设实际数据不比所陈述的

  • 主要内容:查询以特定字符或字符串开头的记录,查询以特定字符或字符串结尾的记录,替代字符串中的任意一个字符,匹配多个字符,匹配指定字符串,匹配指定字符串中的任意一个,匹配指定字符以外的字符,使用{n}或者{nm}来指定字符串连续出现的次数正则表达式主要用来查询和替换符合某个模式(规则)的文本内容。例如,从一个文件中提取电话号码,查找一篇文章中重复的单词、替换文章中的敏感语汇等,这些地方都可以使用正则表达式。正则表达式强大且灵活,常用于非常复杂的查询。 MySQL 中,使用 REGEXP 关键字指定

  • 问题内容: 我正在尝试找到一种将查询与数据库中的正则表达式匹配的方法。据我所知(尽管我不是专家),尽管大多数DBMS(例如MySQL)都有用于搜索的正则表达式选项,但您只能执行以下操作: 在第1列中找到与我的查询中的正则表达式匹配的所有行。 我想做的是相反的,即: 在第1列中找到所有行,以使第1列中的正则表达式与我的查询匹配。 一个简单的例子-说我有一个像这样的数据库结构: 因此,如果我查询 “

  • 如何在C++中使用正则表达式查询MongoDB数据库。 Mongo-CXX-Driver-R3.1.1 包括听力 这是我尝试过的。 以前我用Java构建了一个软件,现在我正在尝试用Qt C++构建同样的软件,我是C++的新手。 下面是我在java中用于查询的查询代码。

  • 本文向大家介绍正则表达式提取img的src,包括了正则表达式提取img的src的使用技巧和注意事项,需要的朋友参考一下 要匹配的字符串:<img src=image/ad1.gif width="128" height="36"/><img src='image/ad2.gif' width="128" height="36" /> 正则表达式:<img[\s]+src[\s]*=[\s]*(([

  • 问题内容: 我创建了以下SQL正则表达式模式以匹配ISBN: 我使用以下值作为测试数据;但是,未提交数据: 我哪里错了? 问题答案: 您可以使用LIKE执行此操作。 您需要一些OR才能处理不同的ISBN 10和13格式 对于以上字符串: