javascript - 多行正则表达式不太匹配所有内容

标签 javascript regex parsing

我得到了一个包含原始维基百科数据的字符串。它的一部分看起来像这样:

{{други значения||||Втората балканска война|Междусъюзническа война}}
{{Инфокутия военен конфликт
|име=Балканска война
|резултат=победа за [[Балкански съюз|Балканския съюз]], [[Лондонски мирен договор]], независимост на [[Албания]], [[Междусъюзническа война]]
|страна1=Балкански съюз:<br />• [[Картинка:Flag of Bulgaria.svg|20px|border]] [[България]]<br />• [[Картинка:Flag_of_Greece_(1822-1978).svg|20px|border]] [[Гърция]]<br />•  [[Картинка:Flag of the Kingdom of Montenegro.svg|20px|border]] [[Черна гора]] <br /> • [[Картинка:State Flag of Serbia (1882-1918).svg|20px|border]] [[Сърбия]]
|страна2= [[Картинка:Ottoman Flag.svg|20px]] [[Османска империя]]<br/>
|командир1= [[Картинка:Flag of Bulgaria.svg|20px|border]] [[Фердинанд I]]<br />[[Картинка:Flag of Bulgaria.svg|20px|border]] [[Михаил Савов]]<br />[[Картинка:Flag_of_Greece_(1822-1978).svg|20px|border]] [[Константинос I]]<br /> [[Картинка:Flag of the Kingdom of Montenegro.svg|20px|border]] [[Никола I]]<br />[[Картинка:State Flag of Serbia (1882-1918).svg|20px|border]] [[Радомир Путник]]
|командир2= [[Картинка:Ottoman Flag.svg|20px]] [[Назим паша]]<br /> [[Картинка:Ottoman Flag.svg|20px]] [[Абдулах паша]]<br /> [[Картинка:Ottoman Flag.svg|20px]] [[Зеки паша]]<br /> [[Картинка:Ottoman Flag.svg|20px]] [[Али Ръза паша]]
|сила1=
[[Картинка:Flag of Bulgaria.svg|20px|border]] България - 366 000<br />[[Картинка:State Flag of Serbia (1882-1918).svg|20px|border]] Сърбия - 190 000<br />[[Картинка:Flag_of_Greece_(1822-1978).svg|20px|border]] Гърция - 120 000<br /> [[Картинка:Flag of the Kingdom of Montenegro.svg|20px|border]] Черна гора - 36 000
|сила2=570 000 (максимален брой)
|жертви1=
|жертви2=
}}

More text

请注意整个内容几乎都被 {{ 和 }} 包围了。

问题:

输出应该是这样的

More Text

此刻的样子

[[Картинка:Flag of Bulgaria.svg|20px|border]] България - 366 000[[Картинка:State
 Flag of Serbia (1882-1918).svg|20px|border]] Сърбия - 190 000[[Картинка:Flag_of
_Greece_(1822-1978).svg|20px|border]] Гърция - 120 000 [[Картинка:Flag of the Ki
ngdom of Montenegro.svg|20px|border]] Черна гора - 36 000



}}

More Text

代码

 .replace(/^(\*|\||\{).*|\{\{.*?\}\}|<(.|\n)*?>|<!--[\s\S]*?-->/gm, "") // smth

应该删除所有以 *、|、{ 或 * 开头的行,删除 {{ }} 中的内容,删除标签,删除 html 注释。我哪里错了?

最佳答案

嗯,这对我来说效果很好:

我做了两步替换。

首先,您将所有内容替换为 {{}} :

replace(/\{\{[^\{\}]*\}\}/gm, "")

然后您再次替换出现的(用您的话说)lines starting with *, |, { or *, remove tags, remove html在字符串的其余部分:

replace(/(\*|\||\{).*|\<(.|\n)*?\>|\<\!\-\-[\s\S]*?\-\-\>/gm, "")

代码:

var html = "{{други значения||||Втората балканска война|Междусъюзническа война}}\n{{Инфокутия военен конфликт\n|име=Балканска война\n|резултат=победа за [[Балкански съюз|Балканския съюз]], [[Лондонски мирен договор]], независимост на [[Албания]], [[Междусъюзническа война]]\n|страна1=Балкански съюз:<br />• [[Картинка:Flag of Bulgaria.svg|20px|border]] [[България]]<br />• [[Картинка:Flag_of_Greece_(1822-1978).svg|20px|border]] [[Гърция]]<br />•  [[Картинка:Flag of the Kingdom of Montenegro.svg|20px|border]] [[Черна гора]] <br /> • [[Картинка:State Flag of Serbia (1882-1918).svg|20px|border]] [[Сърбия]]\n|страна2= [[Картинка:Ottoman Flag.svg|20px]] [[Османска империя]]<br/>\n|командир1= [[Картинка:Flag of Bulgaria.svg|20px|border]] [[Фердинанд I]]<br />[[Картинка:Flag of Bulgaria.svg|20px|border]] [[Михаил Савов]]<br />[[Картинка:Flag_of_Greece_(1822-1978).svg|20px|border]] [[Константинос I]]<br /> [[Картинка:Flag of the Kingdom of Montenegro.svg|20px|border]] [[Никола I]]<br />[[Картинка:State Flag of Serbia (1882-1918).svg|20px|border]] [[Радомир Путник]]\n|командир2= [[Картинка:Ottoman Flag.svg|20px]] [[Назим паша]]<br /> [[Картинка:Ottoman Flag.svg|20px]] [[Абдулах паша]]<br /> [[Картинка:Ottoman Flag.svg|20px]] [[Зеки паша]]<br /> [[Картинка:Ottoman Flag.svg|20px]] [[Али Ръза паша]]\n|сила1=\n[[Картинка:Flag of Bulgaria.svg|20px|border]] България - 366 000<br />[[Картинка:State Flag of Serbia (1882-1918).svg|20px|border]] Сърбия - 190 000<br />[[Картинка:Flag_of_Greece_(1822-1978).svg|20px|border]] Гърция - 120 000<br /> [[Картинка:Flag of the Kingdom of Montenegro.svg|20px|border]] Черна гора - 36 000\n|сила2=570 000 (максимален брой)\n|жертви1=\n|жертви2=\n}}{{други значения||||Втората балканска война|Междусъюзническа война}}\n{{Инфокутия военен конфликт\n|име=Балканска война\n|резултат=победа за [[Балкански съюз|Балканския съюз]], [[Лондонски мирен договор]], независимост на [[Албания]], [[Междусъюзническа война]]\n|страна1=Балкански съюз:<br />• [[Картинка:Flag of Bulgaria.svg|20px|border]] [[България]]<br />• [[Картинка:Flag_of_Greece_(1822-1978).svg|20px|border]] [[Гърция]]<br />•  [[Картинка:Flag of the Kingdom of Montenegro.svg|20px|border]] [[Черна гора]] <br /> • [[Картинка:State Flag of Serbia (1882-1918).svg|20px|border]] [[Сърбия]]\n|страна2= [[Картинка:Ottoman Flag.svg|20px]] [[Османска империя]]<br/>\n|командир1= [[Картинка:Flag of Bulgaria.svg|20px|border]] [[Фердинанд I]]<br />[[Картинка:Flag of Bulgaria.svg|20px|border]] [[Михаил Савов]]<br />[[Картинка:Flag_of_Greece_(1822-1978).svg|20px|border]] [[Константинос I]]<br /> [[Картинка:Flag of the Kingdom of Montenegro.svg|20px|border]] [[Никола I]]<br />[[Картинка:State Flag of Serbia (1882-1918).svg|20px|border]] [[Радомир Путник]]\n|командир2= [[Картинка:Ottoman Flag.svg|20px]] [[Назим паша]]<br /> [[Картинка:Ottoman Flag.svg|20px]] [[Абдулах паша]]<br /> [[Картинка:Ottoman Flag.svg|20px]] [[Зеки паша]]<br /> [[Картинка:Ottoman Flag.svg|20px]] [[Али Ръза паша]]\n|сила1=\n[[Картинка:Flag of Bulgaria.svg|20px|border]] България - 366 000<br />[[Картинка:State Flag of Serbia (1882-1918).svg|20px|border]] Сърбия - 190 000<br />[[Картинка:Flag_of_Greece_(1822-1978).svg|20px|border]] Гърция - 120 000<br /> [[Картинка:Flag of the Kingdom of Montenegro.svg|20px|border]] Черна гора - 36 000\n|сила2=570 000 (максимален брой)\n|жертви1=\n|жертви2=\n}}\n\nMore text";

var re1 = /\{\{[^\{\}]*\}\}/gm;
var re2 = /(?:\*|\||\{).*|<(.|\n)*?>|<!--[\s\S]*?-->/gm; 

html = html.replace(re1, "").replace(re2, "");

编辑:

好的,刚刚意识到您的正则表达式出了什么问题。 你需要下订单。首先你必须替换{{里面的内容和 }} , 因为里面有线 {{这不会在其他条件下通过...因此将出现在最终的 html 中。

那么我们的最终表达式将是:\{\{[^\{\}]*\}\}|(?:\*|\||\{).*|\<(.|\n)*?\>|\<\!\-\-[\s\S]*?\-\-\>

ps:不要忘记转义元字符,例如 !-

参见 wrong regex101 examplecorrect regex101 example

关于javascript - 多行正则表达式不太匹配所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20924670/

相关文章:

javascript - GMap 中的标记数组

javascript - 仅从内容页刷新母版页

javascript - 控制台中出现奇怪的 javascript 错误

regex - %{REQUEST_URI} 总是以斜杠开头吗?

java - 分析代码以创建 UML 的最佳方法是什么?

javascript - 你如何停止 Javascript 中的无限循环?

c# - RegularExpression 没有按预期工作 C#

regex - 如何在Lua中写一个等价于/(\(\))?$/in js的正则表达式

java android 将资源文件路径传递给方法参数

python - 是否有用于 Perl 到 Python 转换的编程工具?