2010-10-28 22 views
7

Örneğin 'kedi' ve 'köpek' alt dizelerini ve ayrıca diğer rasgele karakterleri içeren uzun bir dizenin olduğunu düşünelim. BuradaDize deseni eşleştirme sorunu

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

'x', herhangi bir rasgele karakter dizisini (fakat 'cat' ya da 'köpek') temsil etmektedir.

Yapmak istediğim, 'kedi' ve ardından 'kedi' dışındaki herhangi bir karakterin izlediği her 'kedi'yi bulmak. Her durumda 'kedi' ilk örneğini kaldırmak istiyorum.

cat x dog x cat x dog x dog x cat x dog x cat 
:

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

ile bitirmek için: hayır sonraki 'kedi' önce ondan sonra 'köpek' olduğundan bu durumda

, ben parantez [kedi] kaldırmak isteyeyim

Bu nasıl yapılabilir? VonC dizede 'kedi' çiftleri tüm maç için here

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

önerildiği şekilde

ben bir şekilde (n) (? = (N)) gibi normal bir ifade kullanarak düşündüm. Ama yine de 'kedi' öncesi 'köpek' tarafından takip edilmeyen her kediyi çıkarmak için bunu nasıl kullanabileceğimi bilmiyorum.


Yaptığım asıl sorun Java'da. Ama ben sadece genel bir sözde kod/regex çözümü arıyorum.

+0

Hi. Hangi dilde çalıştığınızı bilmek faydalı olacaktır. –

+0

@klausbyskov: Bu düzenleme hakkında emin misiniz? Aşağıdaki iki cümle ve örnek, "izlenen" in aslında onun ne anlama geldiğini belirtmek olduğunu gösteriyor. –

+0

'Takip' demek istemedim! – nodmonkey

cevap

2

Bunu tek bir RE çağrısı ile yapmak istediğiniz belirli bir neden var mı? Bir RE'de gerçekten mümkün olup olmadığından emin değilim.

Bunu yapmak zorunda olsaydım, muhtemelen iki kez geçerdim. İlk önce her bir "kedi" ve "köpek" örneğini işaretleyin, sonra hangi kedilerin kaldırılması gerektiğini belirlemek için bir kod yazın ve bunu başka bir geçişte yapın.

yalancı kod aşağıda:

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