【问题标题】:How can I auto-format code which contains no line breaks or indentation?如何自动格式化不包含换行符或缩进的代码?
【发布时间】:2021-02-02 17:33:13
【问题描述】:

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

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

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

我已经完成了足够多的时间,这样可以节省我将其自动化的时间。我开始尝试编写一个正则表达式来做到这一点,类似于:

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

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

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

【问题讨论】:

    标签: excel regex parsing format sublimetext3


    【解决方案1】:

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

    <?php
    
    $data = '
    =IF(F3,24*IF(AC3,IF(ROW()=16,V3,MIN(IF(OR(1440*SUMIF(AC3:AC$16,TRUE,U3:U$16)>=1440*V3,NOT(AC3)),U3,IF(1440*SUMIF(AC3:AC$16,TRUE,Z3:Z$16)>=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$16,TRUE,U3:U$16)>=1440*V3,NOT(AC3)),U3,IF(
                            1440*SUMIF(
                                AC3:AC$16,TRUE,Z3:Z$16
                                )>=1440*V3,Z3,AA3
                            )
                        ),V3
                    )
                ),U3
            ),""
        )
    

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

    【讨论】:

    • 我明白了,为了让事情变得更容易,您可以在另一种语言中使用正则表达式,这增加了使用变量等有用构造的能力。我的部分困难是因为我使用的是 Sublime 编辑器的“查找和替换”样式正则表达式,而不是像你那样只包含迭代变量的语言。感谢您的帮助!
    • @DavidS。它的正则表达式。意味着它也可以在崇高的文本中使用。
    • 对,我遇到的问题是,由于 Sublime 只是一个文本编辑器,我只能使用正则表达式本身,而不是您使用的任何帮助代码,例如 str_repeat 和$ident 变量。
    • @DavidS。上面的链接有帮助吗? stackoverflow.com/a/10888837/14919621
    • 没错,您可以通过多种方式实现它。您的方法更简单且用户友好。然而,我的方法是程序员专用的。祝你有美好的一天!
    猜你喜欢
    • 2012-09-25
    • 2011-01-22
    • 2023-03-27
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 2010-09-23
    相关资源
    最近更新 更多