正则表达式:如何在替换表达式中使用匹配的长度

时间:2013-06-13 13:57:27

标签: sql regex

我正在尝试编写一个正则表达式,将一些样板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个空格,依此类推?

我不确定正则表达式是否可行,但我想我会把它扔出去,希望有一些知道如何做到这一点的正则表达式大师。

1 个答案:

答案 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