Я пытаюсь создать простой вики-парсер в C#, который будет совместим с trac wiki, но регулярное выражение убивает меня

Сначала мне нужно сопоставить не проанализированные части, поэтому я создал регулярное выражение, которое должно их перехватить:

(?<inlinecode>!?\{\{\{(?<inline>.*?)\}\}\})|(?<inlinecode2>!?`(?<inline2>.*?)`)|(?<definition>^\s+((?:`[^`]*`|\{\{\{(?:}{,2}[^}])*?\}\}\}|[^`{:]|:[^:])+::)(?:\s+|$))

Визуализация регулярных выражений

Debuggex Demo

Эта часть соответствует:

`test` 
{{{test}}}
`{{{test`
{{{``test}}}

Но это не так (и должно быть)

{{{
test
}}}

{{{#!xxx
test
}}}

def::
  some def

Чего мне не хватает RegEx - почти то же самое, что и trac для внутреннего использования.

1 ответ

Решение

Ваш шаблон регулярных выражений правильный. Вы должны просто включить модификатор "dot match linebreak" или поставить это (?:.|[\r\n]) вместо просто .(Точка). Попробуйте это:

(?<inlinecode>!?\{\{\{(?<inline>(?:.|[\r\n])*?)\}\}\})|(?<inlinecode2>!?`(?<inline2>(?:.|[\r\n])*?)`)|(?<definition>^\s+((?:`[^`]*`|\{\{\{(?:}{,2}[^}])*?\}\}\}|[^`{:]|:[^:])+::)(?:\s+|$))

Приветствия.

Другие вопросы по тегам