查看: 55|回复: 0

正则表达式匹配单行、多行注释思路以及代码详解

[复制链接]

0

主题

0

回帖

0

积分

积极分子

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2008-11-7
发表于 2023-12-27 11:28:11 | 显示全部楼层 |阅读模式

该正则表达式用于匹配单行注释、多行注释、JSDoc注释

我的需求是用new Function去执行一段javascript代码,怕代码一多,注释会影响效率,因此我需要寻找字符串的所有类型的注释,将其全部替换为空字符串。

如果仅需要表达式可以直接查看文末总结处

单行注释

//我是单行注释

 它的正则表达式长这样,因为要匹配多个结果,因此使用g修饰符进行全局搜索

const regexp = /\/\/.+\n?/g

正则表达式测试工具进行匹配,匹配结果如下图 

 我们知道\反斜杠是作为转义字符使用的,所以该表单是是全局匹配 //后面加上一个或多个除换行符以外的所有字符 

细心的同学可能会发现,测试的时候并没有\n?,是的,上面测试的正则忽略了换行符

我们直接把匹配到的内容替换为空字符串,发现有好几个换行符,因为正则表达式的.表示除换行符以外的所有字符,但我们如果还希望把换行符删除,那就得在后面添加\n换行符了

然后我们又发现匹配不到最后一行的注释,是的,因为最后一行的注释后面没有换行符,不满足我们的正则表达式,我们肯定是希望能够匹配到的,那么我们最后再对表达式做一下修改,在\n后面添加? ,表示匹配0个或者1个换行符即可 

匹配单行注释的表达式就介绍到这里了,下面是多行注释。

多行注释/JSDoc注释

/*
我是多行的多行注释
*/
/* 我是单行的多行注释 */
/**
 * JSDoc注释
 * @param xxx
 */

 它的正则表达式长这样

const regexp = /\/\*[^\/]*\*\/\n?/g

下文把以/*开头,*/结尾的注释称为多行注释

多行注释又有两种情况,一种是多行的多行注释 ,一种是单行的多行注释

而JSDoc注释本质上也就是多行注释,

我的匹配思路是,/*+除了/的任意字符+*/ + \n换行符(若有)

首先是匹配 /*,表达式如下

const regexp = /\/\*/g

这样注释的开头就匹配出来了。 

然后是匹配 除了/的任意字符

const regexp = /[^\/]*/g

 上述正则表达式的意思是匹配0次或者多次除了/ 之外的字符

 这边使用 /*+除了/的任意字符 进行匹配,从/*一直匹配到/(不包含)为止,匹配结果如下 

最后匹配 */ + \n换行符(若有)

const regexp = /\*\/\n?/g

 注意为啥最后要匹配 */ 而不是 / ,先看一下直接匹配 / ,如下图

 我们可以看到图中圈出的这种情况下,/* /abc */直接匹配了/* /,这肯定不是预期效果,如果替换掉肯定语法报错了,因此我们宁愿不匹配这个,所以即使我们从/*匹配到/,也需要对注释结束进行限制,必须以*/结束才匹配,下面是匹配的最终效果。

 最后我们使用 | 把单行注释和多行注释合并在一起的到匹配单行注释多行注释的正则表达式

const regexp = /\/\*[^\/]*\*\/|\/\/.+\n?/g

总结

匹配单行注释正则表达式

const regexp = /\/\/.+\n?/g

匹配多行注释正则表达式

const regexp = /\/\*[^\/]*\*\//g

匹配单行/多行注释正则表达式

const regexp = /\/\*[^\/]*\*\/|\/\/.+\n?/g
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部