我的用户插入了
等序列________________________
************************
------------------------
♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥
格式化文档(不要问我关于我的用户!)。显示片段时看起来很糟糕。如何删除任何字符的重复?我可以添加单独的过滤器,但它将是一个恒定的猫捉老鼠游戏。
正则表达式可以过滤这些吗?
答案 0 :(得分:11)
尝试类似:
(.)\1{5,}
匹配任何字符,然后匹配该字符的5个或更多字符。如果你的语言使用正则表达式模式的字符串,请记住逃避\
答案 1 :(得分:5)
您可以使用简单的正则结构(.)\1+
然而,这也将捕获合法用途,例如拼写中加倍字母的单词(气球,拼写,井等等。)
所以,你可能想要将表达式限制为一些不允许的字符,毕竟尽可能保持它是通用的,以便不必随时修改它,因为你的用户找到了新的字符使用。
一种可能的解决方案是禁止重复的非字母和非数字字符:
([^A-Za-z0-9])\1+
但即使这不是所有案例的最终解决方案,因为您的一些用户实际上可能决定使用实际的字母序列作为分隔符:
ZZZZZZZZZZZZZZZZZZZZZZ
BBBBBBBBBBBBBBBBBBBBBB
ZZZZZZZZZZZZZZZZZZZZZZ
为了不允许这种情况并且允许合法使用某些重复的非字母字符(例如在省略号中......),您可以将字符重复限制为最多3个,使用语法为(<pattern>)\1{min, max}
的正则表达式:(.)\1{4,}
来匹配有问题的字符序列,最小长度为4,未指定的最大长度。
答案 2 :(得分:1)
在python中(但无论语言如何,逻辑都相同):
>>> import re
>>> text = '''
... This is some text
... ________________________
... This some more
... ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥
... Truly the last line
... '''
>>> print re.sub(r'[_♥]{2,}', '', text) #this is the core (regexp)
This is some text
This some more
Truly the last line
这样做的好处是,您可以控制替换内容和不替换内容(例如,您可能希望不替换.
,因为它可能是This is still to do...
等评论的一部分。
修改强>
如果您的重复始终是“行”,则可以在表达式中添加换行符:
text = '''
This is some text
________________________
This some more
♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥
Truly the last line
But this is not to be changed: ♥♥♥
'''
>>> print re.sub(r'\n[_♥]{2,}\n', '\n', text)
This is some text
This some more
Truly the last line
But this is not to be changed: ♥♥♥
HTH