Javascript 如何从字符串中删除所有Wiki模板?

Javascript 如何从字符串中删除所有Wiki模板?,javascript,regex,mediawiki-templates,Javascript,Regex,Mediawiki Templates,我有维基百科文章的内容,内容如下: {{使用mdy日期|日期=2014年6月} {{Infobox个人 |name=Richard Matthew Stallman |image=richardstallman-Fête de l'Humanité2014-010.jpg |描述=Richard Stallman,2014年 |出生日期={出生日期和年龄| 1953 | 03 | 16} |出生地点=纽约市 |国籍=美国人 |其他名称=RMS,RMS |已知=自由软件运动、GNU、Emacs、G

我有维基百科文章的内容,内容如下:

{{使用mdy日期|日期=2014年6月}
{{Infobox个人
|name=Richard Matthew Stallman
|image=richardstallman-Fête de l'Humanité2014-010.jpg
|描述=Richard Stallman,2014年
|出生日期={出生日期和年龄| 1953 | 03 | 16}
|出生地点=纽约市
|国籍=美国人
|其他名称=RMS,RMS
|已知=自由软件运动、GNU、Emacs、GNU编译器集合| GCC
|母校=哈佛大学,麻省理工学院
占领=自由软件基金会主席
|网站={{URL|https://www.stallman.org/}}
|奖项=麦克阿瑟奖学金
EFF先锋奖
“…见#荣誉和奖项|荣誉和奖项” }}

{{需要引证|日期=2011年5月}
如何删除它?我可以使用这个正则表达式:
/\{{[^}]+\}/g
,但它不适用于像Infobox这样的嵌套模板

我曾尝试使用此代码先删除嵌套模板,然后删除信息框,但结果不正确

var input=document.getElementById('input');
input.innerHTML=input.innerHTML.replace(/\{{[^}]+\}}}/g',)
{{使用mdy日期|日期=2014年6月}
{{Infobox个人
|name=Richard Matthew Stallman
|image=richardstallman-Fête de l'Humanité2014-010.jpg
|描述=Richard Stallman,2014年
|出生日期={出生日期和年龄| 1953 | 03 | 16}
|出生地点=纽约市
|国籍=美国人
|其他名称=RMS,RMS
|已知=自由软件运动、GNU、Emacs、GNU编译器集合| GCC
|母校=哈佛大学,麻省理工学院
占领=自由软件基金会主席
|网站={{URL|https://www.stallman.org/}}
|奖项=麦克阿瑟奖学金
EFF先锋奖
“…见#荣誉和奖项|荣誉和奖项”
}}
Javascript正则表达式没有与嵌套括号匹配的功能(如递归或平衡组)。正则表达式的一种方法是使用一种模式对字符串进行多次处理,以找到最里面的括号,直到没有可替换的内容:

do {
    var cnt=0;
    txt = txt.replace(/{{[^{}]*(?:{(?!{)[^{}]*|}(?!})[^{}]*)*}}/g, function (_) {
        cnt++; return '';
    });
} while (cnt);
图案详情:

{{
[^{}]* # all that is not a bracket
(?: # this group is only useful if you need to allow single brackets
    {(?!{)[^{}]* # an opening bracket not followed by an other opening bracket
  |   # OR
    }(?!})[^{}]* # same thing for closing brackets
)*
}}
如果不想多次处理该字符串,也可以在找到括号时通过增加和减少标记来读取字符串

另一种方法是使用拆分和
数组.prototype.reduce

var stk = 0;
var result = txt.split(/({{|}})/).reduce(function(c, v) {
    if (v == '{{') { stk++; return c; }
    if (v == '}}') { stk = stk ? stk-1 : 0; return c; }
    return stk ? c : c + v;
});

@yurzui这对包含{{}的文本在多个地方@jcubic不起作用你的意思是不应该匹配
foo
?如果你可以分两步完成,你可以先匹配内部,然后匹配外部,这是针对内部的