2010-10-28 5 views
7

Imaginez que nous ayons une longue chaîne contenant les sous-chaînes 'cat' et 'dog' ainsi que d'autres caractères aléatoires, par ex.Problème de correspondance de motif de cordes

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

Ici 'x' représente toute séquence aléatoire de caractères (mais pas 'cat' ou 'dog'). Ce que je veux faire est de trouver chaque «chat» qui est suivi par tous les caractères sauf «chien», puis par «chat». Je veux supprimer cette première instance de 'chat' dans chaque cas.

Dans ce cas, je veux enlever le [cat] entre crochets parce qu'il n'y a pas de « chien » après avant le prochain « chat »:

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

Pour terminer avec:

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

Comment cela peut-il être fait?

Je pensais que l'utilisation d'une certaine manière une expression régulière comme (n) (? = (N)) comme VonC recommandé here

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

pour correspondre à toutes les paires de 'chat' dans la chaîne. Mais je ne suis toujours pas sûr de savoir comment je pourrais utiliser ceci pour enlever chaque chat qui n'est pas suivi de 'chien' avant 'chat'.


Le vrai problème que j'aborde est en Java. Mais je suis vraiment à la recherche d'une solution générale pseudocode/regex.

+0

Salut. Il serait utile de savoir dans quelle langue vous travaillez. –

+0

@klausbyskov: Êtes-vous sûr de cette modification? Les deux phrases suivantes et l'exemple me semblent indiquer que "suivi" est bien ce qu'il voulait dire. –

+0

Je voulais dire 'suivi' non précédé! – nodmonkey

Répondre

2

Y a-t-il une raison particulière pour laquelle vous voulez faire cela avec un seul appel RE? Je ne suis pas sûr que ce soit possible dans un RE.

Si je devais le faire, j'irais probablement en deux passes. Commencez par marquer chaque occurrence de 'cat' et 'dog' dans la chaîne, puis écrivez du code pour identifier les chats à supprimer, et faites-le dans un autre passage.

pseudocode suit:

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