正则表达式:如何检查选择前是否只有空格

3
我需要将代码中特定一组字符对齐,但需要满足以下条件:
  1. 它必须是行内的最后一项。
  2. 它必须是“有效”的行,也就是说,在该字符串之前必须有除空格以外的内容。
我一直在尝试对齐以下内容:
            //Example                                                                  
            //########.#

            LDT     (exampleCode)
//########.#                E       (exampleCode)
            AND     (exampleCode)                    //########.#
            AND     (exampleCode)            //########.#
            MEMO    (exampleCode)                         //########.#

我开始尝试在SublimeText3上使用正则表达式来使得上述代码与以下代码对齐:

            //Example                                                                  
            //########.#

            LDT     (exampleCode)
//########.#                E       (exampleCode)
            AND     (exampleCode)                    //########.#
            AND     (exampleCode)                    //########.#
            MEMO    (exampleCode)                    //########.#

"//########.#"是我想要对齐的字符集。

我已经可以遵循第一条规则,使用以下内容:

//[0-9]{8}\.[0-9a-zA-Z]$

然而,这样的结果最终会变成这个样子:
            //Example                                                                  
                                                     //########.#

            LDT     (exampleCode)
//########.#                E       (exampleCode)
            AND     (exampleCode)                    //########.#
            AND     (exampleCode)                    //########.#
            MEMO    (exampleCode)                    //########.#

我希望找到一种方法来检查在我想对齐的字符之前是否有任何内容,以便仅在有任何内容出现时对齐,而不仅仅是空格。


换句话说,您想对非空行对齐内联注释?您已经知道要将它们移动到哪一行(以字符为单位)的开头吗? - Casimir et Hippolyte
是的,没错。然而距离可能会有所不同,因为有些代码块只有几个字符,在这种情况下,30个字符就可以满足条件,但也有例外,因为行的长度可能会有很大差异。 - user12096823
2个回答

0

从您的模式来看,我假设 # 是数字,因为您想匹配 [0-9]{8} 8 个数字。

如果是这样的话,一个选项可能是使用2个捕获组并在替换中使用它们。

^(\h*\S+(?:\h+\S+)*)\h+(//[0-9]{8}\.[0-9a-zA-Z])$

部分

  • ^字符串的开头
  • (捕获组1
    • \h*\S+匹配0个或多个水平空格字符和1个或多个非空白字符
    • (?:\h+\S+)*重复0次或多次,每次匹配1个或多个水平空格字符和1个或多个非空白字符
  • )关闭组
  • \h+匹配1个或多个水平空格字符(您想要替换的内容)
  • (捕获组2
    • //[0-9]{8}\.[0-9a-zA-Z]您的模式(请注意转义点)
  • )关闭组
  • $字符串的结尾

在替换中使用这2个组,并填充您想要的空格数量

$1 $2

正则表达式演示


0

我建议分两步:

  • 第一步是为每个目标行添加空格,以确保最小代码行的注释在最长代码行结束的列之后。无需搜索最长代码行,一个上限近似值就足够了。假设是100。

  • 第二步是删除无用的空格以对齐注释。假设您希望所有注释都在第80列。

请随意选择其他更适合您需求的值,但是这里的想法是这样的。

检查注释前是否有代码很容易解决。您必须从开头描述该行,并描述注释之前的非空字符\S

  1. 第一步(将所需空格数放入替换字符串中)

搜索:^\h*\S.*\K(?=//\d{8}\.[[:alnum:]]$)
替换:

  1. 第二步

搜索:^(?=\h*\S.*(//\d{8}\.[[:alnum:]]$))(.{80}).*
替换:$2$1

细节:

^   # anchor for the start of the line
(?=\h*\S.*(//\d{8}\.[[:alnum:]]$)) # lookahead assertion to
  # select only lines with code before (as in the first pattern)
  # and to capture at the same time the comment substring in the
  # capture group $1
(.{80}) # capture the first 80 chars in group $2
.* # consume the end of the line (useless spaces + comment)

由于前瞻只是一个零宽度断言,它不会消耗字符,因此您可以使用.{80}从行的开头匹配所需数量的字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接