使用正则表达式格式化Sublime中的文本

时间:2019-03-14 12:02:08

标签: regex sublimetext2

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

...
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不匹配的原因。谢谢。

1 个答案:

答案 0 :(得分: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以匹配任何换行序列。