这是为了使MediaWiki中的“模板”与PHP类似,以使嵌套模板之间的参数有效。
是否可以使用正则表达式来捕获大括号之间出现的所有字符,但如果它出现在嵌套的大括号中,则会忽略它的出现次数?
| {{ | {{ | }} | | }} |
突出显示:
| {{ *|* {{ | }} *|* *|* }} |
答案 0 :(得分:0)
m/.*{{([^{]+)}}/
只要'{'不存在,就可以在{{和}}之间捕获一个组 - 语法是perl
尽管使用解析器
可以做得更好再次编辑。
答案 1 :(得分:0)
不,你必须编写一个无上下文语法(或Perl递归regexps)来解析它。被忽略的嵌套模板是什么?
解析器在伪代码中看起来像这样:
input = "| {{ | {{ | }} | | }} |", pointer = 0;
char = '', results = [];
read_next_char() {
return input[++ pointer];
}
go_back_one_char() {
pointer --;
}
while (char = read_next_char()) {
if (char == '{') {
if (read_next_char() == '{') InsideBraces();
else go_back_one_char();
}
}
InsideBraces(skipping=false) {
result = "";
while (char = read_next_char()) {
if (char == '{') {
if (read_next_char() == '}') InsideBraces();
else go_back_one_char();
} else if (char == '}') {
if (read_next_char() == '}') break;
else go_back_one_char();
} else {
result += char;
}
}
if (!skipping) results.push(result);
}