我正在尝试编写一个正则表达式,将一些样板 SQL 代码重新格式化为更干净的版本。这是一个例子。
我有:
SELECT
[Person].[Name]
[Person].[Address],
[Sales].[TotalAmount]
我想要:
SELECT
[Name] = [Person].[Name],
[Address] = [Person].[Address],
[TotalAmount] = [Sales].[TotalAmount]
我可以编写一个表达式将字段名称移动到赋值语句的左侧,没问题。棘手的部分是获得正确的间距——是否有某种方法可以在替换中使用匹配的长度?另外,使用最长匹配的长度?因此,“[Name]”后将跟随 length(“TotalAmount”) - length(“Name”) = 7 个空格,“[Address]”后将跟随 length(“TotalAmount”) - length(“Address”) = 4 个空格,依此类推?
我不确定这对于正则表达式是否可行,但我想我应该把它扔在那里,希望有一些正则表达式专家知道如何做到这一点。
语言不通但还是要发帖。
preg_replace_callback()
,它可以让你用正则表达式匹配字符串,然后用 PHP 处理它。所以这是一个完整的 PHP 解决方案,请注意,您需要 PHP 5.3+:
$sql = 'SELECT
[Person].[Name]
[Person].[Address],
[Sales].[TotalAmount]';
preg_match_all('#\[[^]]+\]\.(\[[^]]+\])#', $sql, $found); // Match
$max = max(array_map('strlen', $found[1])); // Find max length
$new = preg_replace_callback('#\[[^]]+\]\.(\[[^]]+\])#', function($m)use($max){
$string = $m[1].str_repeat(' ',$max - strlen($m[1])).' = '.$m[0]; // Constructing
return($string);
}, $sql);
echo $new;
输出:
SELECT
[Name] = [Person].[Name]
[Address] = [Person].[Address],
[TotalAmount] = [Sales].[TotalAmount]