2010-10-28 5 views
7

Представьте, что у нас длинная строка, содержащая подстроки «cat» и «dog», а также другие случайные символы, например.Проблема соответствия шаблонов строк

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

Здесь 'x' представляет любую случайную последовательность символов (но не 'cat' или 'dog').

Что я хочу сделать, это найти каждый «кот», за которым следуют любые символы, кроме «собака», а затем «кот». Я хочу удалить этот первый экземпляр «cat» в каждом случае.

В этом случае, я хотел бы, чтобы удалить квадратные скобки [кошку], потому что нет «собаки» после него до следующих «кошек»:

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

Чтобы закончить с:

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

Как это можно сделать?

Я думал как-то с помощью регулярного выражения, как (п) (? = (П)), как VonC рекомендуется here

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

соответствовать всем парам «кошки» в строке. Но я до сих пор не знаю, как я могу использовать это, чтобы удалить каждого кота, за которым не следует «собака» перед «кошкой».


Настоящая проблема, которую я решаю, - это Java. Но я действительно просто ищу общее решение псевдокода/регулярного выражения.

+0

Привет. Было бы полезно узнать, на каком языке вы работаете. –

+0

@klausbyskov: Вы уверены в том, что редактируете? Следующие два предложения и пример кажутся мне указанием на то, что «последовало» - это то, что он имел в виду. –

+0

Я действительно имел в виду, что «следовало» не предшествовало! – nodmonkey

ответ

2

Есть ли какая-то особая причина, по которой вы хотите сделать это одним звонком? Я не уверен, действительно ли это возможно в одном RE.

Если бы мне пришлось это сделать, я бы, вероятно, пошел через два прохода. Сначала отметьте каждый экземпляр «cat» и «dog» в строке, затем напишите код, чтобы определить, какие кошки нужно удалить, и сделайте это в другом проходе.

ПСЕВДОКОД следующим образом:

// 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()); 
Смежные вопросы