2010-10-28 94 views
7

想象一下,我們有一個包含子字符串'cat'和'dog'以及其他隨機字符的長字符串,例如。字符串模式匹配問題

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

這裏'x'表示任何隨機的字符序列(但不是'貓'或'狗')。

我想要做的是找到每個'貓',其後是任何字符,除了'狗',然後是'貓'。我想在每種情況下刪除第一個「貓」的實例。

在這種情況下,我會想刪除括號[貓]因爲沒有「狗」後,之前的下一個「貓」:

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 

就結了

這怎麼辦?

我想以某種方式使用像(N)(?=(n))的正則表達式的作爲VonC推薦 here

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

以匹配字符串中的所有對 '貓' 的。但我仍然不確定如何使用它來刪除在「貓」之前沒有跟隨「狗」的每隻貓。


我正在處理的真正問題是在Java中。但我真的只是尋找一個通用的僞代碼/正則表達式解決方案。

+0

嗨。知道你在用什麼語言工作會很有用。 – 2010-10-28 16:43:02

+0

@klausbyskov:你確定要編輯嗎?下面的兩句話和這個例子似乎表明,「跟隨」的確是他的意思。 – 2010-10-28 16:51:12

+0

我的意思是'跟着'沒有先行! – nodmonkey 2010-10-28 16:56:26

回答

2

是否有任何特殊的原因,你想這樣做只有一個RE呼叫?我不確定這是否真的可能在一個RE中。

如果我必須這樣做,我可能會兩次通過。首先在字符串中標記每個「貓」和「狗」的實例,然後編寫一些代碼來確定哪些貓需要刪除,並在另一個通道中執行該操作。

僞代碼如下:

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