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

时间:2019-09-20 17:45:30

标签: regex

在以下情况下,我需要在代码上对齐一组特定的字符:

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

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

2 个答案:

答案 0 :(得分:0)

根据您的模式,我假设onPressed()是数字,因为您想匹配# 8位数字。

在这种情况下,一个选择可能是使用2个捕获组,然后在替换组中使用。

[0-9]{8}

部分

  • ^(\h*\S+(?:\h+\S+)*)\h+(//[0-9]{8}\.[0-9a-zA-Z])$ 字符串的开头
  • ^捕获组1
    • (匹配0+个水平空白字符,1 +个非空白字符
    • \h*\S+重复0+次,匹配1+个水平空白字符和1+个非空白字符
  • (?:\h+\S+)*关闭群组
  • )匹配1个以上的水平空白字符(您要替换)
  • \h+捕获组2
    • (您的图案(注意不要出现点)
  • //[0-9]{8}\.[0-9a-zA-Z]关闭群组
  • )字符串结尾

在替换中,使用2组并用所需的空格填充

$

Regex demo

答案 1 :(得分: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}

从行首开始匹配所需的字符数。