Как сопоставить все слова, кроме одного?

Я пытаюсь сопоставить выражения, которые начинаются с PRE и заканчиваются на PRE. Я ищу ленивое совпадение, то есть окончание PRE в сопоставленном выражении должно быть первым, найденным после начального PRE. Я пытался добиться этого с помощью регулярного выражения с отрицательным прогнозом, тестируя RegExr:

Регулярное выражение:

PRE(\w|\s)+(?!PRE)

Выражение для соответствия:

PRE erp PRE edas PRE

Приведенное выше выражение полностью соответствует заданному регулярному выражению, в то время как я ожидал, что оно будет соответствовать только PRE erp PRE. Пожалуйста, предложите регулярное выражение, которое лениво сопоставляет выражение, начинающееся и заканчивающееся на PRE.


person simpatico    schedule 23.06.2012    source источник
comment
Это должно вернуть, сколько совпадений? 2?   -  person GrayFox374    schedule 23.06.2012
comment
Имеет ли значение регистр? То есть будет ли pre или pRe (например) рассматриваться как разделитель?   -  person Alan Moore    schedule 23.06.2012


Ответы (3)


"(PRE)(.*?)(PRE)" 

Это работает для меня в моем (C#) коде, возвращая одно совпадение, PRE erp PRE.

        var codeBlocks = Regex.Matches("PRE erp PRE edas PRE", "(PRE)(.*?)(PRE)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
        MessageBox.Show("Matches found: " + codeBlocks.Count.ToString() + "\nMatch: " + codeBlocks[0].Value);
person GrayFox374    schedule 23.06.2012
comment
вы должны убрать флаг ignorecase - person guido; 23.06.2012

Предположим, что ваш язык поддерживает ленивое сопоставление (если он поддерживает просмотр, я полагаю, он также поддерживает ленивый квантификатор):

PRE(.*?)PRE

Поскольку этот ответ может быть неправильным, пожалуйста, укажите свой язык в следующий раз. Regex имеет разный набор функций для разных языков.

person nhahtdh    schedule 23.06.2012
comment
Вот и я тоже придумал. - person GrayFox374; 23.06.2012

Это должно сделать работу:

(?<=PRE)(.+?)(?=PRE)

http://regexr.com?31bc5

person guido    schedule 23.06.2012