用于将 mysql sql 语法转换为 sqlite 兼容语法的正则表达式(简单情况)

发布于 2024-10-31 21:04:13 字数 614 浏览 1 评论 0原文

我想将以下 sql 查询: 转换

'UNIQUE KEY `UNIQUE_TAG` (`identifier`,`keyname`)'

为:

'CONSTRAINT `UNIQUE_TAG` UNIQUE (`identifier`,`keyname`)'

我的问题是,我必须将第一个关键字作为 var 获取,如下所示:

'<$1> KEY `UNIQUE_TAG` (`identifier`,`keyname`)'

在这里获取它

'CONSTRAINT `UNIQUE_TAG` <$1> (`identifier`,`keyname`)'

看看 http://www.sqlite.org/lang_createtable.html 查看 sqlite 兼容 SQL 的语法。

我想用 PHP 来做,但我不知道如何完成。

提前致谢。

i want to convert the following sql query:

'UNIQUE KEY `UNIQUE_TAG` (`identifier`,`keyname`)'

into this:

'CONSTRAINT `UNIQUE_TAG` UNIQUE (`identifier`,`keyname`)'

My problem is, i have to grab the first keyword as a var, like this:

'<$1> KEY `UNIQUE_TAG` (`identifier`,`keyname`)'

to get it here

'CONSTRAINT `UNIQUE_TAG` <$1> (`identifier`,`keyname`)'

Have a look at http://www.sqlite.org/lang_createtable.html to see the syntax of sqlite compatible SQL.

I want to do it in PHP, but i have no idea how to get this done.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

笑饮青盏花 2024-11-07 21:04:13

你的语法相差不远。

这个例子应该有帮助:

$query = "UNIQUE KEY `UNIQUE_TAG` (`identifier`,`keyname`)";

$regex = "/\b([^ ]+) KEY ([^ ]+) \(([^)]+)\)/";
$substitution = "CONSTRAINT $2 $1 ($3)";

$results = preg_replace($regex, $substitution, $query);

print $results;

一些解释:

  • \b 匹配 单词边界(字符串或空格的开头)
  • [^ ] 匹配非空格字符,[^ ]+ 匹配非空格字符一个或更多时候
  • (...) 捕获 ... 的内容。此捕获组可以在替换字符串中通过 $1 引用(因为它是第一个捕获组)
  • [^)]+ 匹配非右括号字符的字符串,即至少一个字符长

可读性较差但更通用的匹配:

$regex = "/\b(\w+)\h+KEY\h+(\H+)\h+\(([^)]+)\)/";

进一步说明:

  • \w+ 匹配一个或多个“单词”字符
  • \h+ 匹配一个或多个水平空白字符(制表符)和空格)
  • \H 匹配一个或多个非“水平空白”字符(反引号不是单词字符)

Your syntax wasn't far off.

This example should help:

$query = "UNIQUE KEY `UNIQUE_TAG` (`identifier`,`keyname`)";

$regex = "/\b([^ ]+) KEY ([^ ]+) \(([^)]+)\)/";
$substitution = "CONSTRAINT $2 $1 ($3)";

$results = preg_replace($regex, $substitution, $query);

print $results;

Some explanation:

  • \b matches a word boundary (beginning of the string or whitespace)
  • [^ ] matches non-space characters and [^ ]+ matches non-space characters one or more times
  • (...) captures whatever ... is. This captured group can be referenced in the substitution string by $1 (since it's the first capture group)
  • [^)]+ matches a string of non-closing parenthesis characters that is at least one character long

Less readable but more generalized matching:

$regex = "/\b(\w+)\h+KEY\h+(\H+)\h+\(([^)]+)\)/";

Further explanation:

  • \w+ matches one or more "word" characters
  • \h+ matches one or more horizontal whitespace characters (tabs and spaces)
  • \H matches one or more non-"horizontal whitespace" characters (backticks aren't word characters)
情话已封尘 2024-11-07 21:04:13

试试这个正则表达式 (UNIQUE )?KEY (.+) (\(.+\)) 并替换为 CONSTRAINT $2 $1$3

<?php
$sourcestring="UNIQUE KEY `UNIQUE_TAG` (`identifier`,`keyname`)";
echo preg_replace('/(UNIQUE )?KEY (.+) (\(.+\))/','CONSTRAINT $2 $1$3',$sourcestring);
?>

http://www.myregextester.com/?r=83cd23ec

Try this regex (UNIQUE )?KEY (.+) (\(.+\)) and replace with CONSTRAINT $2 $1$3

<?php
$sourcestring="UNIQUE KEY `UNIQUE_TAG` (`identifier`,`keyname`)";
echo preg_replace('/(UNIQUE )?KEY (.+) (\(.+\))/','CONSTRAINT $2 $1$3',$sourcestring);
?>

http://www.myregextester.com/?r=83cd23ec

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文