我需要匹配以下整个声明:
{{CalendarCustom|year={{{year|{{#time:Y}}}}}|month=08|float=right}}
基本上只要有{
,就需要有相应的}
,但原始代码中有许多嵌入式{ }
。例如{{match}}
或{{ma{{tch}}}}
或{{m{{a{{t}}c}}h}}
。
我现在有这个:
(\{\{.+?(:?\}\}[^\{]+?\}\}))
这不太有用。
答案 0 :(得分:15)
.NET正则表达式引擎允许递归匹配:
result = Regex.Match(subject,
@"\{ # opening {
(?> # now match...
[^{}]+ # any characters except braces
| # or
\{ (?<DEPTH>) # a {, increasing the depth counter
| # or
\} (?<-DEPTH>) # a }, decreasing the depth counter
)* # any number of times
(?(DEPTH)(?!)) # until the depth counter is zero again
\} # then match the closing }",
RegexOptions.IgnorePatternWhitespace).Value;
答案 1 :(得分:4)
我建议为此编写一个简单的解析器/标记器。
基本上,您遍历所有字符并开始计算{
和}
的实例 - 递增{
并递减}
。记录每个第一个{
的索引和每个最后}
的索引,您将获得嵌入式表达式的索引。
此时,您可以使用substring
来获取这些内容并从原始字符串中删除/替换它们。
请参阅this问题和答案,了解RegEx不适合的原因。