RegExp-块注释到单注释优化 优化

RegExp-块注释到单注释优化 优化,regex,optimization,match,comments,regex-group,Regex,Optimization,Match,Comments,Regex Group,我在使用以下正则表达式时遇到问题: /^\s*/?\*{1,2}\s*\b.*\b\s**/?\124;\*/?\ s*$/g 我想知道我是否可以改进这个表达方式?另外,如果有人发现这个表达式有问题,请注意。这是我的现场直播。它适用于我在下面设置的所有条件 测试约束 这些比赛 /** /* * */ /**Javadoc*/ /*挡块*/ *多线 /*单线*/ /**A /**A*/ /*A /*A*/ 这些不应该 7 * 8 //定期评论 后果 将匹配项替换为://$3后 我成功地转换了它们,

我在使用以下正则表达式时遇到问题:

/^\s*/?\*{1,2}\s*\b.*\b\s**/?\124;\*/?\ s*$/g 我想知道我是否可以改进这个表达方式?另外,如果有人发现这个表达式有问题,请注意。这是我的现场直播。它适用于我在下面设置的所有条件

测试约束 这些比赛 /** /* * */ /**Javadoc*/ /*挡块*/ *多线 /*单线*/ /**A /**A*/ /*A /*A*/ 这些不应该 7 * 8 //定期评论 后果 将匹配项替换为://$3后

我成功地转换了它们,尽管其中一些具有尾随空白:

// // // //Javadoc //挡块 //多线 //单线 //A //A //A //A 正则表达式解释
当您必须考虑字符串嵌入、转义和行继续时,解析C/C++风格的注释会稍微复杂一些

这还需要在检查完所有其他内容后使用单字符消费传递方法。在这种情况下,在许多可能的匹配选项中,只有一项与您相关-C样式注释/**/

因此,在全局搜索和大量匹配的情况下,只有一个询问您,比如说捕获组1匹配。当然,在你的情况下,简单的替换并不能解决问题

因此,您必须处于全局查找而不是替换循环中。每个匹配项都是源字符串的一部分,不会跳过任何部分,因此每个匹配项都将附加到目标字符串

循环期间,当捕获组1匹配C样式注释时,可以执行不那么简单的替换,使之成为C++注释,然后将结果附加到目标字符串。 这就是问题所在。如果这不能用你使用的任何语言来完成,那么它就不能正确完成,这是肯定的

下面是要执行到//转换的正则表达式列表。当您捕获C风格的注释时,它们必须按照出现的顺序执行。符号为Perl,例如:

 # s{ ^  /\*     (?: [^\S\n] | \*)*       }{// }xmg;
 # s{ ^          (?: [^\S\n] | \*)* \*/ $ }{// }xmg;
 # s{ ^                                 $ }{// }xmg;
 # s{ ^          (?: [^\S\n] | \*)+       }{// }xmg;
 # s{ (?<![\s*]) (?: [^\S\n] | \*)+     $ }{}xmg;
 # s{ (?<![\s*]) (?: [^\S\n] | \*)* \*/ $ }{}xmg;

那应该是什么语言?请注意,line*Multi line没有灰显。这是因为您为语法突出显示指定了JavaScript模式,但JavaScript不支持嵌套注释。事实上,我不知道有哪种语言能做到这一点。哦,我想说得非常笼统。我正在尝试替换Notepad++中的块注释。
 # s{ ^  /\*     (?: [^\S\n] | \*)*       }{// }xmg;
 # s{ ^          (?: [^\S\n] | \*)* \*/ $ }{// }xmg;
 # s{ ^                                 $ }{// }xmg;
 # s{ ^          (?: [^\S\n] | \*)+       }{// }xmg;
 # s{ (?<![\s*]) (?: [^\S\n] | \*)+     $ }{}xmg;
 # s{ (?<![\s*]) (?: [^\S\n] | \*)* \*/ $ }{}xmg;
    # (?:(/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)|//(?:[^\\]|\\\n?)*?\n)|(?:"(?:\\[\S\s]|[^"\\])*"|'(?:\\[\S\s]|[^'\\])*'|[\S\s][^/"'\\]*)
    # -----------------------------------------------------------------


    (?:                             # Comments 

         (                               # (1 start)
              /\*                             # Start /* .. */ comment
              [^*]* \*+
              (?: [^/*] [^*]* \*+ )*
              /                               # End /* .. */ comment
         )                               # (1 end)
      |  
         //                              # Start // comment
         (?: [^\\] | \\ \n? )*?          # Possible line-continuation
         \n                              # End // comment
    )
 |  
    (?:                             # Non - comments 
         "
         (?: \\ [\S\s] | [^"\\] )*       # Double quoted text
         "
      |  '
         (?: \\ [\S\s] | [^'\\] )*       # Single quoted text
         ' 
      |  [\S\s]                          # Any other char
         [^/"'\\]*                       # Chars which doesn't start a comment, string, escape,
                                         # or line continuation (escape + newline)
    )