Как я могу получить самые длинные совпадения для подстрок, заключенных в "{{" и "}}"?
Я пытаюсь разобрать файл викитекста, полученный через API Википедии, и проблема в том, что некоторые из его шаблонов (т.е. фрагменты, заключенные в {{и}}) автоматически не расширяются в викитекст, поэтому мне нужно вручную искать их в статье источник и заменить их в конце концов. Вопрос в том, могу ли я использовать регулярные выражения в.NET для получения совпадений из текста?
Чтобы попытаться прояснить себя, вот пример, чтобы проиллюстрировать, что я имею в виду:
Для строки
{{ abc {{...}} def {{.....}} gh }}
должно быть одно совпадение, а именно вся строка, поэтому самое длинное совпадение.
С другой стороны, для "осиротевших" фигурных скобок, таких как в этом примере:
{{ abc {{...}}
результатом должно быть одно совпадение: {{...}}
Может ли кто-нибудь предложить мне предложение? Заранее спасибо.
4 ответа
Не делайте этого с помощью регулярных выражений. Пройдите строку слева направо, и если вы встретите {{толкните ее позицию в стеке, а в}} вытолкните позицию предыдущего {{из стека и вычислите длину. Тогда вы можете легко взять максимум этих длин.
Вы можете сделать это с помощью регулярных выражений.NET, используя определение балансирующих групп.
Пример, приведенный в документации, показывает, как это работает с nestable. <
а также >
, Вы можете легко адаптировать разделители к {{
а также }}
, Вы можете адаптировать его дальше, чтобы учесть один {
а также }
в пределах "текста", если хотите.
Помни что {
а также }
являются метасимволами регулярных выражений; в буквальном смысле, вы можете избежать \{
а также \}
,
Этот шаблон регулярного выражения соответствует любым произвольным числам упомянутого вами шаблона.
\{\{(?:[^{]+\{\{[^}]+\}\})+[^}]+\}\}
Для второго запроса вам понадобится другое регулярное выражение:
\{\{.*?\}\}
Я думаю, что вы смотрите на это не на том уровне. Вместо хакерских решений для регулярных выражений, почему бы просто не попросить MediaWiki API расширить шаблоны для вас? Вы можете передать содержимое для расширения:
http://www.mediawiki.org/wiki/API:Parsing_wikitext
Или, что еще лучше, попросите предварительно расширять шаблоны содержимого по мере их загрузки, указав rvexpandtemplates
: