RegExp-块注释到单注释优化 优化
我在使用以下正则表达式时遇到问题: /^\s*/?\*{1,2}\s*\b.*\b\s**/?\124;\*/?\ s*$/g 我想知道我是否可以改进这个表达方式?另外,如果有人发现这个表达式有问题,请注意。这是我的现场直播。它适用于我在下面设置的所有条件 测试约束 这些比赛 /** /* * */ /**Javadoc*/ /*挡块*/ *多线 /*单线*/ /**A /**A*/ /*A /*A*/ 这些不应该 7 * 8 //定期评论 后果 将匹配项替换为://$3后 我成功地转换了它们,尽管其中一些具有尾随空白: // // // //Javadoc //挡块 //多线 //单线 //A //A //A //A 正则表达式解释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后 我成功地转换了它们,
当您必须考虑字符串嵌入、转义和行继续时,解析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)
)