我想格式化包含按字母顺序排序的关键字的文件,如下所示:
...
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
不匹配的原因。谢谢。
答案 0 :(得分:1)
您的正则表达式在该行之前和之后都使用换行符。在下面的演示中,请注意引擎如何跳过other
行:
您可以使用另一种环视方式来修复该模式,即(?<=\n)
后向正面看:(?<=\n)(.).*\n(?!\1)
,请参见demo。
但是,您可以使用更“线性”的模式而没有环顾四周:
^(.).*(?:\n\1.*)*
或者如果支持\R
:
^(.).*(?:\R\1.*)*
替换为$0\n
。参见regex demo。
详细信息
^
-一行的开头(.)
-捕获组1:除换行符外的任何字符.*
-一行的其余部分(?:\n\1.*)*
-的零次或多次重复
\n
-换行符\1
-与第1组相同的字符.*
-该行的其余部分。用\n
替换\R
以匹配任何换行序列。