【问题标题】:Regex for converting mysql sql syntax to sqlite compatible syntax (easy case)用于将 mysql sql 语法转换为 sqlite 兼容语法的正则表达式(简单案例)
【发布时间】:2025-11-26 23:35:01
【问题描述】:

我想转换以下 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 做,但我不知道如何完成。

提前致谢。

【问题讨论】:

  • 我还应该提到 sql 的部分发生在一个完整的 CREATE TABLE 语句中。

标签: php sql regex sqlite


【解决方案1】:

你的语法离你不远了。

这个例子应该会有所帮助:

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

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

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

print $results;

一些解释:

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

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

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

进一步解释:

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

【讨论】:

  • 谢谢 - 我忘了说这句话只是一个例子。键(在本例中:标识符、键名)和约束名称(在本例中:UNIQUE_TAG)可能会不时变化。
  • 好的。我已经概括了约束名称和键。
【解决方案2】:

试试这个正则表达式 (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

【讨论】: