Разбор wikiText с регулярным выражением в Java - PullRequest
3 голосов
/ 03 июня 2011

Учитывая строку wikiText, такую ​​как:

{{ValueDescription
    |key=highway
    |value=secondary
    |image=Image:Meyenburg-L134.jpg
    |description=A highway linking large towns.
    |onNode=no
    |onWay=yes
    |onArea=no
    |combination=
    * {{Tag|name}}
    * {{Tag|ref}}
    |implies=
    * {{Tag|motorcar||yes}}
    }}

Я хотел бы проанализировать шаблоны ValueDescription и Tag в Java / Groovy.Я попытался с regex /\{\{\s*Tag(.+)\}\}/, и это нормально (он возвращает |name |ref и |motorcar||yes), но /\{\{\s*ValueDescription(.+)\}\}/ не работает (он должен вернуть весь текст выше).

Ожидаемый результат

Есть ли способ пропустить вложенные шаблоны в регулярном выражении?

В идеале я бы предпочел использовать простой инструмент wikiText 2 xml , но я не смогнайди что-нибудь подобное.

Спасибо!Mulone

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Произвольно вложенные теги не будут работать, поскольку это делает грамматику нерегулярной .Вам нужно что-то, способное справиться с контекстно-свободной грамматикой. ANTLR - хороший вариант.

2 голосов
/ 03 июня 2011

Создайте свой шаблон регулярного выражения, используя опцию Pattern.DOTALL, например:

Pattern p = Pattern.compile("\\{\\{\\s*ValueDescription(.+)\\}\\}", Pattern.DOTALL);

Пример кода:

Pattern p=Pattern.compile("\\{\\{\\s*ValueDescription(.+)\\}\\}",Pattern.DOTALL);
Matcher m=p.matcher(str);
while (m.find())
   System.out.println("Matched: [" + m.group(1) + ']');

OUTPUT

Matched: [
|key=highway
|value=secondary
|image=Image:Meyenburg-L134.jpg
|description=A highway linking large towns.
|onNode=no
|onWay=yes
|onArea=no
|combination=
* {{Tag|name}}
* {{Tag|ref}}
|implies=
* {{Tag|motorcar||yes}}
]

Обновление

Предполагая, что закрытие }} отображается в отдельной строке для {{ValueDescription, следующий шаблон будет работать для захвата нескольких ValueDescription:

Pattern p = Pattern.compile("\\{\\{\\s*ValueDescription(.+?)\n\\}\\}", Pattern.DOTALL);
...