Как я могу получить самые длинные совпадения для подстрок, заключенных в "{{" и "}}"? - PullRequest
1 голос
/ 14 октября 2010

Я пытаюсь проанализировать файл викитекста, полученный через API Википедии, и проблема в том, что некоторые из его шаблонов (то есть фрагменты, заключенные в {{и}}) автоматически не расширяются в викитекст, поэтому мне приходится искать их вручную в статье источника и заменить их в конце концов. Вопрос в том, могу ли я использовать регулярные выражения в .NET для получения совпадений из текста?

Чтобы попытаться прояснить себя, вот пример, чтобы проиллюстрировать, что я имею в виду:

Для строки

{{ abc {{...}} def {{.....}} gh }}

должно быть одно совпадение, а именно вся строка, поэтому самое длинное совпадение.

С другой стороны, для «осиротевших» фигурных скобок, таких как в этом примере:

{{ abc {{...}}

результатом должно быть одно совпадение: {{...}}

Может ли кто-нибудь предложить мне предложение? Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 14 октября 2010

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

Пример, приведенный в документации, показывает, как он работает с нестабильными < и >. Вы можете легко адаптировать разделители к {{ и }}. Вы можете адаптировать его, чтобы разрешить одиночные { и } внутри «текста», если хотите.

Помните, что { и } являются метасимволами регулярных выражений; чтобы соответствовать буквально, вы можете сбежать на \{ и \}.

1 голос
/ 14 октября 2010

Не делайте этого с регулярным выражением. Пройдите строку слева направо, и если вы встретите {{поместите свою позицию в стек, а в}}, вытолкните позицию предыдущего {{из стека и вычислите длину. Тогда вы можете легко взять максимум из этой длины.

0 голосов
/ 08 ноября 2010

Я думаю, что вы смотрите на это не на том уровне.Вместо хакерских решений для регулярных выражений, почему бы просто не попросить MediaWiki API расширить шаблоны для вас?Вы можете передать содержимое для расширения:

http://www.mediawiki.org/wiki/API:Parsing_wikitext#expandtemplates

Или, что еще лучше, попросить шаблоны в содержимом предварительно расширяться при загрузке, указав rvexpandtemplates:

http://www.mediawiki.org/wiki/API:Query_-_Properties#revisions

0 голосов
/ 14 октября 2010

Этот шаблон регулярного выражения соответствует любым произвольным числам упомянутого вами шаблона.

\{\{(?:[^{]+\{\{[^}]+\}\})+[^}]+\}\}

Для второго запроса вам понадобится другое регулярное выражение:

\{\{.*?\}\}
...