【问题标题】:Multiline regex not much matching everything多行正则表达式不太匹配所有内容
【发布时间】:2014-01-04 18:06:26
【问题描述】:

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

{{други значения||||Втората балканска война|Междусъюзническа война}}
{{Инфокутия военен конфликт
|име=Балканска война
|резултат=победа за [[Балкански съюз|Балканския съюз]], [[Лондонски мирен договор]], независимост на [[Албания]], [[Междусъюзническа война]]
|страна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 cmets。我哪里错了?

【问题讨论】:

    标签: javascript regex parsing


    【解决方案1】:

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

    我做了两步替换。

    首先将所有替换为{{}}

    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 中。

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

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

    查看wrong regex101 examplecorrect regex101 example

    【讨论】:

    • 是的,成功了。奇怪的是,在我问这个问题之前我试过了,但它不起作用。谢谢。
    猜你喜欢
    • 2011-04-13
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2013-11-25
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多