为什么替换/*注释时输出失真
本文关键字:输出 失真 注释 替换 为什么 | 更新日期: 2023-09-27 18:10:57
我想用//
替换所选文本中的/*
。
我使用正则表达式来完成此操作。当我使用任何其他字符串时,它都有效。但当我使用时:
String result = System.Text.RegularExpressions.Regex.Replace(seltext,"/*","//");
它显示:
/* int a,b; // sample input
///*i//n//t//a//,//b//; // sample output
相反,我想要:
// int a,b;
*
在正则表达式中有一个特殊的含义——它的意思是"匹配前面的0个或多个字符/组"。
听起来你根本不想要正则表达式——你只想要
string result = seltext.Replace("/*", "//");
如果你真的想使用正则表达式,你需要转义*
(以及其他各种字符,如果你使用的话(:
string result = Regex.Replace(seltext, @"/'*", "//");
请注意使用逐字逐句的字符串文字(由字符串开头的@
表示(,以避免由于C#字符串文字原因也必须转义'
。您需要使用"/''*"
,但它并不那么清楚。逐字字符串文字对于正则表达式来说非常方便。
不过,我建议在尝试对源代码使用简单的文本操作(包括正则表达式(时要小心。例如,想象一下将替换应用于上面的第一个代码片段。。。
您的问题是为什么。。。。输出错误
让我们从WHY
开始,然后我们将查看修复程序。
问题的核心是/*
能够匹配空字符串。因此,在每个位置插入//
您需要逃离量化符*
- 在正则表达式中,
*
的意思是"匹配零次或多次之前的内容"> - 因此,
/*
与/*
不匹配,而是空字符串(零斜杠(或一系列斜杠:////
- 若要匹配文字
*
,请使用反斜杠对其进行转义:'*
。因此,您的正则表达式变为/'*
/*
在字符串中的每个单个位置匹配
- 因为
/*
可以匹配空字符串,所以它在每个位置都匹配 - 因此,在每个位置插入
//
,从而得到结果
在C#代码中:不仅替换/*
,还替换/******
固定的文本/*
不需要使用regex,因此为了使其更有趣,我们不仅要替换/*
,还要替换/*****
。为此,我们在'*
之后添加一个+
量词。一行就足够了:
string resultString = Regex.Replace(s1, @"/'*+", "//");
- 观看此演示,观察我们如何在每个位置进行匹配
- 请参阅此演示以了解如何进行更换