【问题标题】:Formatting text in sublime using regex使用正则表达式在 sublime 中格式化文本
【发布时间】:2019-08-05 07:42:04
【问题描述】:

我想格式化包含按字母顺序排序的关键字的文件,如下所示:

...
national day
national
other
random
random2
...

我想在以不同字母开头的关键字之间放置一个空格(意思是 a 和 b 之间的空格等),看起来像这样:

...
national day
national

other

random
random2
...

我正在使用正则表达式执行此操作,我尝试的正则表达式是\n(.{1,1})(?:.*?)\n(?!\1)。这适用于大多数情况,除非一个字母表中只出现一次关键字,在这种情况下为otherLink to regex.

可以看出nationalrandom2 匹配,但other 不匹配,尽管我相信完全有理由这样做。

有效的正则表达式是^(.{1,1})(?:.*?)\n(?!\1)(第一个\n^ 替换)但我需要一个原因,为什么第一个正则表达式与other 不匹配。谢谢。

【问题讨论】:

    标签: regex sublimetext2


    【解决方案1】:

    您的正则表达式在该行之前和之后都使用换行符。在下面的演示中,注意引擎如何跳过other 行:

    您可以通过另一个环视来修复该模式,(?<=\n) 正向环视:(?<=\n)(.).*\n(?!\1),请参阅demo

    但是,您可以使用更“线性”的模式,没有环视:

    ^(.).*(?:\n\1.*)*
    

    或者如果支持\R

    ^(.).*(?:\R\1.*)*
    

    替换为$0\n。请参阅regex demo

    详情

    • ^ - 行首
    • (.) - 捕获组 1:除换行符以外的任何字符
    • .* - 一行的其余部分
    • (?:\n\1.*)* - 零次或多次重复
      • \n - 换行
      • \1 - 与第 1 组中的字符相同
      • .* - 该行的其余部分。

    \n 替换为\R 以匹配任何换行序列。

    【讨论】:

    • 是的,我知道当正则表达式以 ^ 开头时它可以工作,我想知道当正则表达式以 \n 开头时它为什么不工作
    • @gc7__ 您必须使用^ 来匹配行首。 \n 匹配换行符。
    • 但是在nationalother 之前有一个换行符,当有多个以o 开头的关键字而不是只有一个以a 开头的关键字时,这将起作用o,这是我的困惑
    • @gc7__ 是的,我的意思是你的正则表达式不能匹配other,因为它之前的换行符已经被前面的迭代消耗了。
    • 我现在明白了,它就像nationallergy 将与national 匹配,但与正则表达式national|allergy 中的“过敏”不匹配,但将与national|(?<=al)lergy 匹配。谢谢
    猜你喜欢
    • 2019-09-15
    • 2017-09-29
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多