正则表达式可以找到重复的字符吗?

时间:2011-10-12 06:00:28

标签: regex

我的用户插入了

等序列
________________________
************************
------------------------
♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥

格式化文档(不要问我关于我的用户!)。显示片段时看起来很糟糕。如何删除任何字符的重复?我可以添加单独的过滤器,但它将是一个恒定的猫捉老鼠游戏。

正则表达式可以过滤这些吗?

3 个答案:

答案 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