我正在尝试在C#中创建与trac wiki兼容的简单wiki解析器,但正则表达式正在杀死我

时间:2014-05-23 09:19:48

标签: c# regex parsing wiki

我需要先匹配未解析的部分,所以我创建了应该抓住它们的正则表达式:

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

Regular expression visualization

Debuggex Demo

此部分匹配:

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

但这不是(也应该):

{{{
test
}}}

{{{#!xxx
test
}}}

def::
  some def

我错过了什么。 RegEx几乎与trac在内部使用相同。

1 个答案:

答案 0 :(得分:1)

你的正则表达式是正确的。您应该启用“dot matches linebreak”修饰符,或者将此(?:.|[\r\n])设置为.(点)。 试试这个:

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

干杯。