регулярное выражение жадной задачи (C #) - PullRequest
6 голосов
/ 11 марта 2011

У меня есть строка ввода, такая как "=== text === и === text ===", и я хочу заменить синтаксис вики на соответствующий HTML-тег.

input:

===text=== and ===text===

желаемый вывод:

<h1>text</h2> and <h1>text</h2>

но с помощью следующего кода я получаю этот вывод:

var regex = new Regex("---(.+)---");
var output = regex.Replace("===text=== and ===text===", "<h1>$1</h1>");

<h1>text=== and ===text</h1>

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

Спасибо и всего наилучшего.Дэнни

Ответы [ 5 ]

14 голосов
/ 11 марта 2011

Добавьте знак вопроса к своему регулярному выражению: === (. +?) ===

Лучшей альтернативой было бы иметь регулярное выражение следующей формы: === ([^ \ =] +) ===. См. это руководство о символе точки для объяснения того, как использовать эту точку экономно. При сравнительном анализе моего регулярного выражения оно составляет ок. На 50% быстрее, чем ваше регулярное выражение.

3 голосов
/ 11 марта 2011

Чтобы регулярное выражение не было жадным, вы используете?

Таким образом, выражение "=== (. +?) ===" будет иметь два совпадения для вас - поэтому вы должны сгенерировать <h1>text</h1>и <h1>text</h1>

0 голосов
/ 14 марта 2011

И просто для информации, если у других такая же проблема, как и у меня, - чтобы избежать совпадения также ====Text==== вместо ===Text=== Я расширил шаблон следующим образом: (?<!=)===([^=]+)===(?!=)

0 голосов
/ 11 марта 2011

Я добавлю еще один вариант: ===((?:(?!===).)*)=== (перестаньте ловить любой символ, когда вы встретите ===) ... Ох ... и для проблемы ., предложенной WiseGuyEh, я предлагаю RegexOptions.SingleLine, поэтому что . соответствует даже символу новой строки.

0 голосов
/ 11 марта 2011

Просто дд ? может быть?

===.+?===
...