我想格式化包含按字母顺序排序的关键字的文件,如下所示:
...
national day
national
other
random
random2
...
我想在不同字母表之间的关键字之间放置一个空格(意思是a和b之间的空格等),这看起来像这样:
...
national day
national
other
random
random2
...
我正在使用正则表达式,我尝试的正则表达式是\n(.{1,1})(?:.*?)\n(?!\1)
。这适用于大多数情况,除非一个字母表中只出现一个关键字,在这种情况下为other
。 Link to regex。
可以看出national
和random2
匹配,但other
不匹配,虽然我相信它有充分的理由。
有效的正则表达式是^(.{1,1})(?:.*?)\n(?!\1)
(第一个\n
被^
取代)但我需要一个理由为什么第一个正则表达式与other
不匹配。谢谢。
你的正则表达式消耗该行之前和之后的新行。在下面的演示中,请注意引擎如何跳过other
线:
你可以用另一个环视来修复这个模式,一个(?<=\n)
正面看后方:(?<=\n)(.).*\n(?!\1)
,请参阅demo。
但是,您可以使用更“线性”的模式,没有外观:
^(.).*(?:\n\1.*)*
或者如果支持\R
:
^(.).*(?:\R\1.*)*
替换为$0\n
。见regex demo。
细节
^
- 开始一条线(.)
- 捕获组1:除了换行符之外的任何字符.*
- 其余的一行(?:\n\1.*)*
- 零次或多次重复
\n
- 换行符
\1
- 与第1组相同的字符
.*
- 其余部分。用\n
替换\R
以匹配任何换行符序列。