.NET C# 用正则匹配多系统换行符删除//行尾注释失效问题
问题根源
在.NET的正则实现中,RegexOptions.Multiline模式下的$锚点仅识别\n作为行终止标记,单独的\r不会被判定为行结束位置。之前使用的//.*$会贪婪匹配从//开始直到下一个\n前的所有字符,中间的\r以及\r之后到\n之前的内容都会被整体匹配替换,最终导致包含\r的后续行内容丢失。
正向预查的写法因为没有正确覆盖所有换行场景的匹配边界,也无法达到兼容三种换行格式的效果。
解决方案
使用排除字符组匹配//之后所有非换行符的内容,不需要依赖Multiline模式即可自动适配\r、\n、\r\n三种换行格式,且不会吃掉换行符本身。
正则表达式改为://[^\r\n]*
修改后的完整代码如下:
public static class CommentRemover { private static readonly Regex RegexRemoveLineEndComment = new Regex(@"//[^\r\n]*"); public static string RemoveLineEndComment(this string text) { return RegexRemoveLineEndComment.Replace(text, string.Empty); } }
效果验证
使用提供的测试代码运行后,输出结果完全符合预期:txt = "int rn = 0; \r\nint r = 0; \rint n = 0; \nend"
注意:该正则仅适用于代码中不存在字符串内容包含
//的场景,如果需要处理字符串、正则字面量中的//避免误删,需要搭配语法解析器实现,无法仅通过单条正则完成精确匹配。
内容的提问来源于stack exchange,提问作者cheny
相关产品推荐
相关产品推荐

