c#用1个空格替换多个空格,保留特殊字符

本文关键字:空格 保留 特殊字符 替换 1个 | 更新日期: 2023-09-27 18:14:24

有一点问题,因为我必须将字符串转换为表。我想删除多个空格,但不是全部。所以文本中的数据返回时中间有很多空格,比如:

 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE'r'n 
 services                                    0  Disc                      'r'n 
 console                                     1  Conn                      'r'n 
                   alinav                    2  Disc                      'r'n  
 rdp-tcp                                 65536  Listen                    'r'n  

我仍然想保留定义行的'r'n'值,我想保留列下合法的空值,我想保留定义列的空格。但是我想删除那些我不想输入值的额外空格。

我试过:

output = Regex.Replace(output, @"'s{2,}", " ", RegexOptions.Multiline);
output = output.Replace("  ", " ");

但是第一个只是删除了所有东西(我需要和不需要的东西)。第二个空格还是太多了

谢谢。

c#用1个空格替换多个空格,保留特殊字符

你可以做两件事:

在正则表达式中显式地使用空格's也包含像('n, 'r, 't,…)这样的奇怪字符,因此:

output = Regex.Replace(output, @" +", " ", RegexOptions.Multiline);

或者应用第二种方法直到收敛:

string s2 = output;
do {
    output = s2;
    s2 = s2.Replace("  "," ");
} while(output != s2);

在大多数情况下,第一个方法将优于第二个。这是因为第一个方法用两个或多个空格对所有子字符串进行分组。一般来说,正则表达式比简单的字符串替换要慢一些,但如果字符串包含有许多空格的序列,第一种方法会更快。

在您的示例中,数据由位置分隔,而不是由字符分隔;对吗?如果是,你应该按位置提取;比如:

foreach (string s in output.Split())
{
    var sessionName = s.Substring(0, 18).Trim();
    var userName = s.Substring(18, 19).Trim();
    var id = Int32.Parse(s.Substring(37, 8).Trim());
    var whateverType = s.Substring(45, 12).Trim();
    var device = s.Substring(57, 6).Trim();
}

当然,您需要进行适当的错误检查,并且可能应该将字段宽度放入数组并计算位置,而不是像我所展示的那样对它们进行硬编码。