词法分析器:含引号内*/的/* */型注释识别求助
注释识别正则解决方案
你的问题是要匹配/*和*/之间的注释,仅当*/不在双引号内时才作为注释结束标记,以下是具体解决办法:
你现有方案的问题
- 第一个正则
/\*.*?\*/用了非贪婪匹配,但无法区分引号内的*/,会错误把引号外的第一个*/当作结束,比如/* "*/" test */会被截断成/* "*/。 - 第二个正则语法混乱,存在多余空格和错误转义,根本无法正常工作。
正确的正则表达式
Pattern commentPattern = Pattern.compile("/\\*(([^\"*/]|\"(\\\\.|[^\"])*\"|\\*[^/]|/[^*]))*\\*/");
正则逻辑拆解
/\*:匹配注释的起始标记/*- 核心匹配部分
(([^"*/]|"(\\.|[^"])*"|\*[^/]|/[^*]))*循环处理四种情况:[^"*/]:匹配除双引号、*、/之外的任意字符(包括空格、换行)"(\.|[^"])*":匹配双引号包裹的内容,其中\\.处理转义字符(比如\"),[^"]匹配非引号的普通字符,确保引号内的*/不会被当作结束标记\*[^/]:匹配单独的*(后面没有紧跟/),避免误判为结束标记/[^*]:匹配单独的/(后面没有紧跟*),避免误判为注释起始标记
\*/:匹配注释的结束标记*/
补充说明
- 如果你的场景不需要处理转义引号(比如注释内不会出现
\"),可以把正则里的"(\\.|[^"])*"简化为"[^"]*" - 如果需要支持多行注释,Java中默认
.不匹配换行,但上面的正则用排除法已经包含换行,无需额外设置DOTALL标志。
内容的提问来源于stack exchange,提问作者Anastasia Frontend
相关产品推荐
相关产品推荐

