为什么更换/ *注释时出现乱码输出?

时间:2014-06-30 05:53:54

标签: c# regex

我想用/*替换所选文本中的//

我用正则表达式来做这件事。当我使用任何其他字符串时它起作用。但是当我使用时:

String result = System.Text.RegularExpressions.Regex.Replace(seltext,"/*","//");

它显示:

/* int a,b;              // sample input

///*i//n//t//a//,//b//;  // sample output

相反,我想:

// int a,b;

2 个答案:

答案 0 :(得分:3)

*在正则表达式中具有特殊含义 - 它表示"匹配前面字符/组中的0或更多"。

听起来你根本不想要正则表达式 - 你只想要

string result = seltext.Replace("/*", "//");

如果您真的想使用正则表达式,则需要转义*(以及其他各种字符,如果您使用它们):

string result = Regex.Replace(seltext, @"/\*", "//");

请注意使用逐字字符串文字(由字符串开头的@表示),以避免因C#字符串字面原因而逃避\。您需要使用"/\\*"并不清楚。逐字字符串文字对于正则表达式非常方便。

我建议在尝试在源代码上使用简单的文本操作(包括正则表达式)时要小心。例如,假设将替换应用于上面的第一个代码片段......

答案 1 :(得分:2)

您的问题是为什么......输出错误?

让我们从WHY开始,然后我们将看看修复。

问题的核心是/*能够匹配空字符串。因此,在每个位置,您都会插入//

您需要逃离量词*

  • 在正则表达式中,*表示“匹配前面零次或多次的内容”。
  • 因此,/*/*不匹配,而是空字符串(零斜线)或一系列斜杠:////
  • 要匹配文字*,请使用反斜杠\*对其进行转义。因此,您的正则表达式变为/\*

/*匹配字符串中的每个位置

  • 因为/*可以匹配空字符串,所以它匹配每个位置。
  • 因此,在每个位置,您插入//,因此您的结果

在C#代码中:不仅替换/*,还替换/******

没有必要为正确的文字/*使用正则表达式,因此为了使其更有趣,我们不仅会替换/*而是/*****。这样做,我们在+之后添加\*量词。一行就足够了:

string resultString = Regex.Replace(s1, @"/\*+", "//");
  1. 请参阅this demo观察每个位置的匹配方式。
  2. 请参阅this demo了解如何进行更换。