2010-10-28 15 views
7

Imagine que tenemos una cadena larga que contiene las subcadenas 'cat' y 'dog', así como otros caracteres aleatorios, por ejemplo.Problema de coincidencia de patrón de cadena

cat x dog cat x cat x dog x dog x cat x dog x cat 

Aquí 'x' representa cualquier secuencia aleatoria de caracteres (pero no 'gato' o 'perro').

Lo que quiero hacer es encontrar cada 'gato' que es seguido por cualquier caracter excepto 'perro' y luego por 'gato'. Quiero eliminar esa primera instancia de 'gato' en cada caso.

En este caso, yo quiero quitar el [cat] entre corchetes porque no hay 'perro' después de que antes de la próxima 'gato':

cat x dog [cat] x cat x dog x dog x cat x dog x cat 

para terminar con:

cat x dog x cat x dog x dog x cat x dog x cat 

¿Cómo se puede hacer esto?

pensé de alguna manera mediante una expresión regular como (n) (? = (N)) como VonC recomienda here

(cat)(?=(.*cat)) 

para que coincida con todos los pares de 'gato' en la cadena. Pero todavía no estoy seguro de cómo podría usar esto para eliminar a cada gato que no es seguido por 'perro' antes de 'gato'.


El problema real que estoy abordando es en Java. Pero realmente solo estoy buscando una solución general de pseudocódigo/expresión regular.

+0

Hola. Sería útil saber en qué idioma está trabajando. –

+0

@klausbyskov: ¿Está seguro de esa edición? Las siguientes dos oraciones y el ejemplo me parecen indicar que "seguido" es de hecho lo que él quiso decir. –

+0

¡Quise decir 'seguido' no precedido! – nodmonkey

Respuesta

2

¿Hay alguna razón en particular por la que desee hacer esto con solo una llamada RE? No estoy seguro de si eso es realmente posible en una RE.

Si tuviera que hacer esto, probablemente iría en dos pases. Primero marque cada instancia de 'gato' y 'perro' en la cadena, luego escriba un código para identificar qué gatos necesitan ser eliminados y hágalo en otro pase.

Pseudocódigo sigue:

// Find all the cats and dogs 
int[] catLocations = string.findIndex(/cat/); 
int[] dogLocations = string.findIndex(/dog/); 
int [] idsToRemove = doLogic(catLocations, dogLocations); 

// Remove each identified cat, from the end to the front 
for (int id : idsToRemove.reverse()) 
    string.removeSubstring(id, "cat".length()); 
Cuestiones relacionadas