在.NET中替换正则表达式令牌?

时间:2010-09-23 22:50:38

标签: .net regex

我不确定“令牌替换”是否是正确的词组,但这是我正在尝试做的事情:

在字符串中,如果我找到两个或多个连续的空格(\ s)又名 - 空格,新行,制表符等。我想用它自己的一个实例替换它匹配的任何内容。

示例:

a   b   b 

会变成

a b b

a


b


c

会变成:

a

b

c

可以使用.net regex完成吗?

5 个答案:

答案 0 :(得分:2)

如果你想正确地替换双重换行符和空格,你需要使用它:

string input = @"a


b


c  d  e";

string result = Regex.Replace(input, @"(\r\n|\s)\1", "$1");

\1将查找与组(\s|\r\n)匹配的字符,并且替换字符串中的$1将仅使用该组的单个实例替换匹配

如果你想用一个实例替换多个副本(即连续3个),你需要使用@"(\r\n|\s)\1+"作为模式,但副作用是:

a


b


c

将缩减为:

a
b
c

答案 1 :(得分:0)

是的,它可以。使用System.Text.RegularExpressions.Regex.Replace:

string str = "a   b   b";
Regex rexReplace = new Regex(" +");
str = rexReplace.Replace(str, new MatchEvaluator(delegate(Match match)
{
    return " ";
}));

答案 2 :(得分:0)

对于后代,我的解决方案来自this question

Regex 
    regex_select_all_multiple_whitespace_chars = 
        new Regex(@"\s+",RegexOptions.Compiled);

var cleanString=
    regex_select_all_multiple_whitespace_chars.Replace(dirtyString.Trim(), " ");

正则表达式不是最好的方法。蛮力方法似乎要快得多。阅读上面的链接......

答案 3 :(得分:0)

string str = "a  b  c       a\r\n\r\nb\r\n\r\nc";

string newstr = Regex.Replace(str, "(\u0200)+", " ");

newstr = Regex.Replace(newstr, "(\t)+", "\t");

newstr = Regex.Replace(newstr, "(\r\n)+", "\r\n");

答案 4 :(得分:0)

使用正则表达式可以实现这一点,但是在添加了多个选项之后它会变得非常有趣。这是正则表达式的一个示例,它只处理空格和制表符。

public static string ShrinkWhitespace(string input)
{
    return Regex.Replace(input, @"(((?<t>\s)\s+)|((?<t>\t)\t+))", "${t}");
}

如果将这些方法编码为简单方法,我发现这样的方法更容易理解和维护。例如。

public string ShrinkWhitespace(string input) {
  var builder = new StringBuilder();
  var i = 0; 
  while ( i < input.Length ) {
    var current = input[i];
    builder.Append(current);
    switch ( current ) {
      case '\t':   
      case ' ': 
      case '\n': 
        i++;
        while ( i < input.Length && input[i] == current ) { 
          i++;
        }
        break;
      default:
        i++;
        break;
    }
  }

  return builder.ToString();
}