如何自动格式化不包含换行符或缩进的代码?
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
当使用任何超过几层深度的 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