2010-10-14 2 views
1

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

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

Для строки

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

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

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

{{ abc {{...}} 

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

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

ответ

1

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

+0

You «Правильно, я попытался использовать стек, и в этом случае это более подходящий подход.Я не очень хорошо разбираюсь в регулярных выражениях, но я подозреваю, что регулярные выражения не всегда будут работать так, как ожидалось, если бы в строке были неспаренные фигурные скобки. –

3

Вы можете сделать это с помощью регулярного выражения .NET, используя balancing groups definition.

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

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

0

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

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

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

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

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

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

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

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

+0

Действительно, jpatokal, это был бы идеальный случай, пусть движок MediaWiki выполнит все расширения; однако существуют некоторые «экзотические» ситуации, когда некоторые из шаблонов wikitext в статьях не расширяются, несмотря на то, что для этого были созданы соответствующие параметры. Вот почему я должен «вручную» собрать все оставшиеся нерасширенные шаблоны после этого и самостоятельно обработать их или снова запросить механизм WikiMedia, но на этот раз расширить только те конкретные шаблоны (которые могут оказаться довольно дорогими). В любом случае, спасибо за ваши предложения! –

Смежные вопросы