RegEx игнорирует текст внутри строк в кавычках в .net

Как игнорировать текст внутри строки в кавычках в .NET. У меня есть следующая строка

This is test, 'this is test inside quote'

Скажем, я ищу test, и его замена должна заменить только test, отсутствующую внутри цитаты.

This is, 'this is test inside quote'. 

Я использую это для сопоставления текста внутри цитируемого текста.

(["']).*?\1

person Ram    schedule 12.07.2011    source источник


Ответы (4)


Я бы использовал Regex.Replace(). Регулярное выражение будет соответствовать строке без кавычек, за которой следует строка в кавычках, и оценщик соответствия заменит test в части без кавычек. Что-то вроде этого:

Regex.Replace("This is test, 'this is test inside quote' test",
              @"(.*?)((?<quote>[""']).*?\k<quote>|$)",
              m => m.Groups[1].Value.Replace("test", "") + m.Groups[2].Value)

Группа 1 — часть без кавычек, группа 2 — часть в кавычках (или конец строки). Результат вышеизложенного:

This is , 'this is test inside quote' 
person svick    schedule 12.07.2011
comment
@Ram, если вы считаете, что ответ действительно отвечает на ваш вопрос и лучше других, вы должны пометить его как «принятый», нажав на галочку. - person svick; 13.07.2011

Вы можете использовать следующий шаблон, чтобы пропустить строки в кавычках:

s = Regex.Replace(s, @"test|(([""']).*?\2)", "$1");

Для каждого символа вашей строки шаблон может соответствовать строке "test", соответствовать и захватывать строку в кавычках или завершаться ошибкой. Если он захватит группу $1, она будет сохранена после замены, в противном случае совпавшая строка будет удалена.

Рабочий пример: http://ideone.com/jZdMy.

person Kobi    schedule 13.07.2011

Я бы извлек эти подстроки в кавычках в список (конечно, если у вас больше одной цитаты), создал бы заполнитель на потом (%1,%2 и т. д.), выполнил регулярное выражение и заменил бы заполнители элементами списка.

person Igoris Azanovas    schedule 12.07.2011
comment
Что делать, если в исходной строке есть %1? - person svick; 13.07.2011
comment
заменены подстроки. Если у вас есть более одной цитаты, число будет увеличиваться. На самом деле, это не регулярное выражение, а более легкий путь из ада регулярных выражений. - person Igoris Azanovas; 13.07.2011

Я вижу одну двойную кавычку и одну одинарную кавычку в регулярном выражении. Убедитесь, что оба являются одинарными кавычками. Возможно, вам тоже нужно избегать одинарных кавычек. ([\'\']).*?\1

person hungryMind    schedule 12.07.2011
comment
То, что находится внутри [], представляет собой группу персонажей, и иметь там и ', и " нормально. Наличие персонажа там дважды — это то же самое, что и наличие его там один раз. - person svick; 13.07.2011
comment
Правильно, но это не просто поиск «или». Должно быть что-то вроде '[*]' - person hungryMind; 13.07.2011
comment
['"] делает именно это — находит ' или ". [*] нашел бы просто звездочку, не уверен, что вы имели в виду. - person svick; 13.07.2011
comment
Я имел в виду любую вещь между двумя одинарными кавычками. Это не было точным регулярным выражением. - person hungryMind; 13.07.2011