Проблема с регулярным выражением, пропуская неизвестное количество совпадений? - PullRequest
0 голосов
/ 20 января 2011

Я использую c #, но в принципе это не очень важно, мой вопрос: возможно ли это только при совпадении с пропуском регулярных выражений?

мое регулярное выражение было

Text = Regex.Replace(Text, @"\[code1\]((.|\n)*?)(\<\/span\>) ", "<span class='spanTest'>$1</span>");

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

У меня есть похожая строка:

[code1]test string bladibla[code2]code2 string</span> [code3] code3 string [code1]&nbsp; </span></span> end of the span string </span>

и мой конечный результат должен выглядеть примерно так:

<span class="spanTest">test string bladibla[code2]code2 string</span> [code3] code3 string [code1]&nbsp; </span></span> end of the span string </span>

Ребята, у вас есть предложения?

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Предполагая, что подстроки, начинающиеся с "[code]" и заканчивающиеся "", могут быть вложены друг в друга, и вы пытаетесь найти совпадающие пары из них, ответ - нет. Регулярные выражения не могут соответствовать вложенным шаблонам, это одно из их теоретических ограничений. (Я знаю, что это не решение, но это разрешение прекратить стучать головой по этой конкретной стене.)

1 голос
/ 20 января 2011

Я не могу следовать за тобой. Ваше регулярное выражение определенно не жадный (*? - это ленивый квантификатор), поэтому он будет соответствовать от [code1] до ближайшего </span>, которое он найдет, как в вашем примере.

Однако, оно также будет совпадать со второго [code1] в вашем образце до следующего </span>. Это поведение вы пытаетесь предотвратить? Если так, в чем разница между этими двумя случаями? Вы хотите сопоставить только первое вхождение, или вы хотите сопоставить его только в начале строки, или ...?

Наконец, вместо ((.|\n)*?) вы можете написать (.*?), если указать RegexOptions.Singleline.

...