原字符串:abbbbbijkijkijkijkijkijkijkijkc
----------------------------------------------------------------------------
目标1:
把字符串中连续重复3次以上的单个字符压缩成1次,即把bbbbb变成b
查找的正则表达式为:
(.)\1{2,}
解释:
.代表任意指定的一个字符,
而(.)\1中的\1代表的是引用了等同于括号的内容,
\1{2,}则代表\1所引用的内容连续出现了至少两次。
所以,(.)\1{2,}这串正则表达式,代表了(.)本身以外,后面还跟着等同于(.)的内容出现了至少两次,也就是说任意指定的一个字符连续出现了至少三次。
替换的正则表达式为:
\1
解释:
很明显,要把查找到的内容替换成\1所引用的内容,也是(.),在这里就是b。
替换后结果:
abijkijkijkijkijkijkijkijkc
----------------------------------------------------------------------------
目标2:
把上一步处理好的abijkijkijkijkijkijkijkijkc中的连续重复两次以上的字符串压缩成一个字符串,即把ijkijkijkijkijkijkijkijk变成ijk
查找的正则表达式为:
(..+?)\1{1,}
解释:
.代表任意指定的一个字符,..+?则代表任意指定的长度为2以上的字符串,并且是非贪婪匹配,即..+?匹配到的是ijk。如果改成..+,则是贪婪匹配,会匹配到ijkijkijkijk,贪婪匹配会造成需要反复进行查找替换操作logN次(N为字符串重复次数),才能匹把重复N次的字符串压缩成一次。而非贪婪匹配只需查找替换一次。
而(..+?)\1中的\1代表的是引用了等同于括号的内容,
\1{1,}则代表\1所引用的内容连续出现了至少一次。
所以,(..+?)\1{1,}这串正则表达式,代表了(..+?)本身以外,后面还跟着等同于(..+?)的内容出现了至少一次,也就是说任意指定的长度为2以上的字符串连续出现了至少两次。
替换的正则表达式为:
\1
解释:
很明显,要把查找到的内容替换成\1所引用的内容,也是(..+?),在这里就是ijk。
替换后结果:
abijkc
----------------------------------------------------------------------------
扩展用法:
以上的目标1、2的查找中,要求查找到的重复字符串不是纯数字,只需改为以下正则表达式:
目标1:
([^0-9])\1{2,}
目标2:
要分两步查找替换,
首先查找
([0-9]+[^0-9].*?)\1{1,}
其中([0-9]+[^0-9].*?)代表重复的字符串单位,模式解读为:至少一个(贪婪匹配)数字字符再跟一个非数字字符再跟零个以上(非贪婪匹配)任意字符;
然后查找
([^0-9].+?)\1{1,}
其中([^0-9].+?)代表重复的字符串单位,模式解读为:一个非数字字符再跟一个以上任意字符(非贪婪匹配);
----------------------------------------------------------------------------
附:NOTEPAD++正则表达式高级用法https://blog.csdn.net/yocencyy/article/details/104117433