2010-10-28 19 views
7

Immaginate di avere una stringa lunga contenente le sottostringhe 'gatto' e 'cane' oltre ad altri caratteri casuali, ad es.Problema di corrispondenza del modello di stringa

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

Qui "x" rappresenta qualsiasi sequenza casuale di caratteri (ma non "gatto" o "cane").

Quello che voglio fare è trovare ogni "gatto" seguito da qualsiasi carattere tranne "cane" e poi "gatto". Voglio rimuovere quella prima istanza di "gatto" in ogni caso.

In questo caso, vorrei rimuovere la parentesi [gatto] perché non esiste un 'cane' dopo che prima del prossimo 'gatto':

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

per finire con:

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

Come si può fare?

ho pensato a qualche modo utilizzando un'espressione regolare come (n) (? = (N)) come VonC raccomandato here

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

per abbinare tutte le coppie di 'gatto' nella stringa. Ma non sono ancora sicuro di come potrei usarlo per rimuovere ogni gatto che non è seguito da "cane" prima di "gatto".


Il vero problema che sto affrontando è in Java. Ma in realtà sto solo cercando una soluzione pseudocodice/regex generale.

+0

Hi. Sarebbe utile sapere in quale lingua stai lavorando. –

+0

@klausbyskov: sei sicuro di questa modifica? Le seguenti due frasi e l'esempio mi sembrano indicare che "seguito" è davvero ciò che intendeva. –

+0

Intendevo "seguito" non preceduto! – nodmonkey

risposta

2

C'è qualche ragione particolare per cui vuoi farlo con una sola chiamata RE? Non sono sicuro che sia effettivamente possibile in una RE.

Se dovessi farlo, probabilmente andrei in due passaggi. Contrassegnare prima ogni istanza di "gatto" e "cane" nella stringa, quindi scrivere un codice per identificare quali gatti devono essere rimossi e farlo in un altro passaggio.

Pseudocodice segue:

// 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()); 
Problemi correlati