使用正则表达式在sublime中格式化文本

问题描述 投票:1回答:1

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

...
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个回答
1
投票

你的正则表达式消耗该行之前和之后的新行。在下面的演示中,请注意引擎如何跳过other线:

enter image description here

你可以用另一个环视来修复这个模式,一个(?<=\n)正面看后方:(?<=\n)(.).*\n(?!\1),请参阅demo

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

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

或者如果支持\R

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

替换为$0\n。见regex demo

细节

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

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

© www.soinside.com 2019 - 2024. All rights reserved.