【问题标题】:Regex: How to check if there's only whitespaces before selection正则表达式:如何在选择之前检查是否只有空格
【发布时间】:2020-01-21 18:52:29
【问题描述】:

我需要在我的代码中对齐一组特定的字符,但需要满足以下条件:

  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)                    //########.#

我想找到一种方法来检查该行是否在我要对齐的字符之前有任何内容,以便它仅在它之前有任何内容而不是空格时才对齐

【问题讨论】:

  • 换句话说,您想为非空行对齐内联 cmets?您是否已经知道距离要移动它们的行首的距离(以字符为单位)?
  • 是的,没错。但是距离可能会有所不同,因为代码块只有几个字符,在这种情况下,30 个字符就可以满足标准,但也有例外,因为行可能会有很大差异

标签: regex


【解决方案1】:

查看您的模式,我假设 # 是数字,因为您想匹配 [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

Regex demo

【讨论】:

    【解决方案2】:

    我建议分两步:

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

    • 第二步删除无用空格以对齐 cmets。假设您想要第 80 列上的所有 cmets。

    随意选择更适合您需要的其他值,但想法就在这里。

    检查注释前是否有代码很容易解决。您必须从头开始描述该行,并在注释前描述一个非空白字符\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}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 2022-10-12
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多