第一种
/\*([^*]|(\*+([^*/])))*\*+/|[ \t]*//.*
测试如下:
第一种正则匹配注释原理
首先处理 /***/
注释
/\*
表示 /*
开头,\*/
表示 */
结尾。
中间分别处理了不包含 *
的情况和包含 *
的情况:
-
[^*]
表示不包含*
号的所有字符。。 -
\*+([^*/])
表示前方有至少 1 个*
号,后续是非*
和/
的字符
以 *
为划分依据的原因是:当出现 *
时,如果后续跟了一个 /
,则需要停止匹配。
中间这个部分可能有 个或者多个,所以用 *
号修饰中间部分出现的次数:([^*]|(\*+([^*/])))*
。
然后处理 //
注释
-
[ \t]*//.*
表示匹配//
注释,前方可能有多个空格或制表符。
第二种
/\*((?!\*/).|[\r\n])*?\*/|[ \t]*//.*
测试如下:
第二种正则匹配注释原理
首先处理 /***/
注释
-
/\*
表示/*
开头,\*/
表示*/
结尾。 -
(?!\*/)
表示非*/
的字符,但它本身不占位,所以后面加上.
表示匹配除了这个条件之外的所有字符。但.
号无法匹配换行符,所以.
号换成.|[\r\n]
。
中间的内容可以有 个或者 多个,所以给 ((?!\*/).|[\r\n])
加上 *
号。为了不过多匹配,导致到达 */
时仍然无法终止,所以我们给这一段加上?
表示非贪婪匹配 。
然后处理 //
注释
[ \t]*//.*
表示匹配 //
注释,前方可能有多个空格或制表符。
注:细心的读者可能注意到了,这两种匹配方式都无法处理 /** /** */*/
这样的嵌套注释,虽然我们一般不会写这样的嵌套注释,并且这类注释在 Java
中无法编译通过,但这类注释在 Kotlin
中是合法的,此问题笔者暂未找到合适的解决方案,如果读者有更好的正则匹配方案,望不吝赐教。
网友评论