2011-10-12 34 views
6

Mis usuarios insertar secuencias como¿Las expresiones regulares pueden encontrar repeticiones de caracteres?

________________________ 
************************ 
------------------------ 
♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ 

a los documentos de formato (no me pregunte acerca de mis usuarios!). Y se ve mal al mostrar snippets. ¿Cómo puedo eliminar las repeticiones de cualquier personaje? Puedo agregar filtros individuales, pero será un juego constante de gatos y ratones.

¿Puede una expresión regular filtrar estos?

Respuesta

10

intentar algo como:

(.)\1{5,} 

que coincide con cualquier carácter, a continuación, 5 o más de ese personaje. ¡Recuerde escaparse del \ si su lenguaje usa cadenas para patrones de expresiones regulares!

+2

1, pero me gustaría utilizar '[^ a-zA-Z0-9]' en lugar de '.' –

5

Puede eliminar repeticiones de cualquier carácter con una expresión regular simple como (.)\1+

Sin embargo, esto va a coger usos legítimos, tales como las palabras que se han duplicado las cartas en su ortografía (globo, ortografía, bien, etc.).

Por lo tanto, probablemente desee restringir la expresión a algunos caracteres no permitidos, después de todo, manteniéndolo lo más genérico posible, para no tener que modificarlo de vez en cuando, ya que los usuarios encuentran nuevos caracteres usar.
Una posible solución sería la de no permitir que no sean letras y no números caracteres repetidos:

([^A-Za-z0-9])\1+

Pero incluso esto no es una solución definitiva a todos los casos, ya que algunas de sus usuarios realmente pueden decidir utilizar secuencias de letras reales como delimitadores:

ZZZZZZZZZZZZZZZZZZZZZZ 
BBBBBBBBBBBBBBBBBBBBBB 
ZZZZZZZZZZZZZZZZZZZZZZ 

con el fin de no permitir esto y con el beneficio adicional de permitir usos legítimos de algunos caracteres que no sean letras repetidas (como en una elipsis: ...), usted podría restringir las repeticiones de caracteres a un máximo de 3, usando una expresión regular con la sintaxis (<pattern>)\1{min, max} de esta manera: (.)\1{4,} para hacer coincidir secuencias de caracteres ofensivas, con una longitud mínima de 4 y un máximo no especificado.

1

en Python (pero la lógica es la misma, independientemente del idioma):

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

Esto tiene la ventaja de que tiene cierto control sobre lo que debe sustituir y lo que no (por ejemplo, puede no desear sustituir . como podría ser parte de un comentario como This is still to do...

EDIT:.

Si sus repeticiones son siempre "líneas" podría añadir la nueva línea C haracters a su expresión:

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

Cuestiones relacionadas