Проблема сопоставления с образцом строки - PullRequest
7 голосов
/ 28 октября 2010

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

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

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

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

В этом случае я бы хотел убрать скобку [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

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

Я подумал о том, чтобы как-то использовать регулярное выражение типа (n) (? = (N)), как рекомендовал VonC здесь

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

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


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

1 Ответ

2 голосов
/ 28 октября 2010

Есть ли какая-то особая причина, по которой вы хотите сделать это всего одним RE-вызовом?Я не уверен, возможно ли это на одном 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());
...