我正在尝试编写一个正则表达式,将一些样板SQL代码重新格式化为更清晰的版本。这是一个例子。
我有:
SELECT
[Person].[Name]
[Person].[Address],
[Sales].[TotalAmount]
我想:
SELECT
[Name] = [Person].[Name],
[Address] = [Person].[Address],
[TotalAmount] = [Sales].[TotalAmount]
我可以写一个表达式将字段名称移动到赋值语句的左侧,没问题。棘手的部分是让间距正确 - 有没有办法在替换中使用匹配的长度?另外,要使用最长匹配的长度?因此“[Name]”后面跟着长度(“TotalAmount”) - length(“Name”)= 7个空格,“[Address]”后跟长度(“TotalAmount”) - length(“Address”) = 4个空格,依此类推?
我不确定正则表达式是否可行,但我想我会把它扔出去,希望有一些知道如何做到这一点的正则表达式大师。
答案 0 :(得分:0)
关闭语言,但仍会发布。
在PHP中有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]
的 Online demo 强>