美文网首页
匹配 Java/Kotlin 中所有注释的正则表达式

匹配 Java/Kotlin 中所有注释的正则表达式

作者: Vic_wkx | 来源:发表于2021-09-19 01:11 被阅读0次

    第一种

    /\*([^*]|(\*+([^*/])))*\*+/|[ \t]*//.*
    

    测试如下:

    第一种正则匹配注释

    原理

    首先处理 /***/ 注释

    /\* 表示 /* 开头,\*/ 表示 */ 结尾。

    中间分别处理了不包含 * 的情况和包含 * 的情况:

    • [^*] 表示不包含 * 号的所有字符。。
    • \*+([^*/]) 表示前方有至少 1 个 * 号,后续是非 */ 的字符

    * 为划分依据的原因是:当出现 * 时,如果后续跟了一个 /,则需要停止匹配。

    中间这个部分可能有 0 个或者多个,所以用 * 号修饰中间部分出现的次数:([^*]|(\*+([^*/])))*

    然后处理 // 注释

    • [ \t]*//.* 表示匹配 // 注释,前方可能有多个空格或制表符。

    第二种

    /\*((?!\*/).|[\r\n])*?\*/|[ \t]*//.*
    

    测试如下:

    第二种正则匹配注释

    原理

    首先处理 /***/ 注释

    • /\* 表示 /* 开头,\*/ 表示 */ 结尾。
    • (?!\*/) 表示非 */ 的字符,但它本身不占位,所以后面加上 . 表示匹配除了这个条件之外的所有字符。但 . 号无法匹配换行符,所以 . 号换成 .|[\r\n]

    中间的内容可以有 0 个或者 多个,所以给 ((?!\*/).|[\r\n]) 加上 * 号。为了不过多匹配,导致到达 */ 时仍然无法终止,所以我们给这一段加上? 表示非贪婪匹配 。

    然后处理 // 注释

    [ \t]*//.* 表示匹配 // 注释,前方可能有多个空格或制表符。

    注:细心的读者可能注意到了,这两种匹配方式都无法处理 /** /** */*/ 这样的嵌套注释,虽然我们一般不会写这样的嵌套注释,并且这类注释在 Java 中无法编译通过,但这类注释在 Kotlin 中是合法的,此问题笔者暂未找到合适的解决方案,如果读者有更好的正则匹配方案,望不吝赐教。

    相关文章

      网友评论

          本文标题:匹配 Java/Kotlin 中所有注释的正则表达式

          本文链接:https://www.haomeiwen.com/subject/vdmjgltx.html