为什么替换/*注释时输出失真

本文关键字:输出 失真 注释 替换 为什么 | 更新日期: 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, @"/'*+", "//");
  1. 观看此演示,观察我们如何在每个位置进行匹配
  2. 请参阅此演示以了解如何进行更换