如何自动格式化不包含换行符或缩进的代码?

How can I auto-format code which contains no line breaks or indentation?

当使用任何超过几层深度的 Excel 函数时,以单行格式 Excel 显示它们很快就会变得难以阅读: =IF(F3,24*IF(AC3,IF(ROW()=16,V3,MIN(IF(OR(1440*SUMIF(AC3:AC,TRUE,U3:U)>=1440*V3,NOT(AC3)),U3,IF(1440*SUMIF(AC3:AC,TRUE,Z3:Z)>=1440*V3,Z3,AA3)),V3)),U3),"")

所以我经常做的是,我会将它放入 Sublime 并像代码一样缩进,使其立即更容易分析:

=IF(
    F3,
    24*IF(
        AC3,
        IF(
            ROW()=16,
            V3,
            MIN(
                IF(
                    OR(
                        1440*SUMIF(AC3:AC,TRUE,U3:U)>=1440*V3,
                        NOT(AC3)
                    ),
                    U3,
                    IF(
                        1440*SUMIF(AC3:AC,TRUE,Z3:Z)>=1440*V3,
                        Z3,
                        AA3
                    )
                ),
                V3
            )
        ),
        U3
    ),
    ""
)

我已经这样做了很多次,可以节省我自动化它的时间。我开始尝试编写一个正则表达式来执行此操作,大致如下:

查找((?: {4})*)(.*?)\b(IF|AND|OR|MIN|MAX)\(替换(\n

但我无法让它工作,因为正则表达式在递归缩进方面遇到了困难。我找到了一个 Sublime 包,它可以将一系列单独的正则表达式捆绑到一个操作中,这可能有效,但我不确定我将如何处理它。

我怎样才能像这样自动缩进我的代码?是否有任何我可能不知道的替代方法?

正则表达式在所有编程语言中都保持不变。所以你可以简单地在你喜欢的语言中使用上面的正则表达式。

<?php

$data = '
=IF(F3,24*IF(AC3,IF(ROW()=16,V3,MIN(IF(OR(1440*SUMIF(AC3:AC,TRUE,U3:U)>=1440*V3,NOT(AC3)),U3,IF(1440*SUMIF(AC3:AC,TRUE,Z3:Z)>=1440*V3,Z3,AA3)),V3)),U3),"")
';

$pattern = "/IF\((.*)\)/i"; //find string starting with "IF(" and ends with ")"
$ident = 4;

while(preg_match($pattern, $data,$match) == 1) //If matches 
{
   preg_match($pattern, $data, $match);
   $spaces = str_repeat(' ', $ident); //Generate space with length of ident
   $data =  str_replace($match[1],"\n".$spaces.$match[1]."\n".$spaces,$data); 
   $ident += 4; //Increase ident by 4
}
echo $data; //Now output data
?>

这将输出:

=IF(
    F3,24*IF(
        AC3,IF(
            ROW()=16,V3,MIN(IF(
                OR(1440*SUMIF(
                    AC3:AC,TRUE,U3:U)>=1440*V3,NOT(AC3)),U3,IF(
                        1440*SUMIF(
                            AC3:AC,TRUE,Z3:Z
                            )>=1440*V3,Z3,AA3
                        )
                    ),V3
                )
            ),U3
        ),""
    )

http://sandbox.onlinephpfunctions.com/code/b97c528312c03ef556efe3e637e200b73da312e0