正则使用或条件时如何反向引用分组?TypeScript场景示例
TypeScript 移除代码注释并保留换行的正则方案
问题背景
我正在使用TypeScript,希望通过正则表达式移除代码中的所有注释,同时保留换行格式。
示例代码
// this is awesome code const a =1 // this is nice const b = 2 // oh great // with some indentation const x = 99
期望输出
const a =1 const b = 2 const x = 99
我编写的正则是 ^( *//.*)\n|( *//.*),但遇到问题:在或(|)条件后无法反向引用第一个分组,尝试^( *//.*)\n|(\1)的写法行不通,目前用regex101.com测试。
解决方案
你原来的思路方向是对的,但反向引用在这种分支条件里行不通——\1只能引用当前匹配流程中已经捕获到的分组,而|分隔的是两个独立分支,第二个分支里的\1根本没有对应的捕获内容,所以这种写法无效。
其实不用搞分支引用,用一个更简单的正则就能满足需求:
//.*$
必须开启多行模式(m flag),然后将匹配到的内容替换为空字符串即可。
正则逻辑解释
//精准匹配单行注释的起始标记.*匹配注释里的所有内容(直到行尾)$在多行模式下,会匹配每一行的结尾位置,确保只删除当前行的注释部分- 多行模式(m)让
^和$作用于文本的每一行,而不是整个字符串的首尾
扩展:处理多行注释
如果你的代码里还有/* ... */这类多行注释,可以用下面的正则同时处理单行和多行注释:
//.*$|/\*[\s\S]*?\*/
同样开启多行模式,其中:
/\*匹配多行注释的起始[\s\S]*?非贪婪匹配任意字符(包括换行,覆盖多行注释内容)\*/匹配多行注释的结束标记
用这个正则测试你的示例代码,完全能得到你想要的输出结果。
内容的提问来源于stack exchange,提问作者JD Solanki
相关产品推荐
相关产品推荐

