【问题标题】:Regex to remove multi line comments正则表达式删除多行注释
【发布时间】:2011-01-28 08:43:31
【问题描述】:

我正在尝试使用这个正则表达式(JS):

/\/\*(.*)\*\//g

替换

/*
sdandsads
*/

一无所有。

但它不起作用!为什么? o_O

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    点捕获除换行符以外的所有内容..(如果点为假

    所以要么使用dotall(在其他答案/cmets中提到,这在javascript中不受支持,但我将其留在这里以供参考

    /\/\*(.*)\*\//gs
    

    或在您的表达式中添加空格字符\s

    /\/\*((\s|.)*?)\*\//g
    

    艾伦在他的评论中提到我给出的答案表现不佳,因此请改用以下内容..(翻译为所有空格和所有非空格,所以所有内容..

    /\/\*([\s\S]*?)\*\//g
    

    【讨论】:

    • JavaScript 中没有 s(单行)模式,(\s|.) 会导致灾难性的回溯。在 JS 中匹配任何内容(包括换行符)的标准方法是 [\S\s]
    • @alan,关于\s|. 回溯的任何链接?想了解更多。
    • Erik Corry 在这里解释得很好:stackoverflow.com/questions/2407870/…有关灾难性回溯的更一般性讨论,请参阅regular-expressions.info/catastrophic.html
    • @IvanBlack 这肯定不是评论。编译器或解释器会抱怨语法错误。
    • ECMAScript 2022 中添加了 dotall 支持作为参考。
    【解决方案2】:

    两个问题:

    1. 在 javascript 中,没有 dotall 修饰符。您必须使用 hack 来允许匹配换行符,例如使用 [^]
    2. 您正在使用贪婪匹配。如果您的输入中有多个 cmets,则它们之间的所有内容都会被吃掉。

    解决方案:

    /\/\*[^]*?\*\//g
    

    例子:

    > '/*abc\ncde*/qqq/*iop\n\njj*/'.replace(/\/\*[^]*?\*\//g, '')
    qqq
    

    【讨论】:

    • 事实上正确的是:/\/\*[^]*?\*+\//g。在\* 之后缺少+。也可以这样解决:/\/\*.+?\*+\//gs。 JS 现在支持正则表达式中的s 标志,允许. 匹配换行符。非常感谢。
    猜你喜欢
    • 2019-08-31
    • 2012-04-08
    • 2011-02-14
    • 2011-04-01
    • 2015-02-25
    • 1970-01-01
    • 2010-10-13
    • 2018-03-31
    相关资源
    最近更新 更多