繁体   English   中英

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

[英]C# Replacing Multiple Spaces with 1 space leaving special characters intact

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

 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("  ", " ");

但是第一个只是删除所有内容(我需要和不需要的东西)。 第二个仍然留下了太多的空间。

谢谢。

您可以做两件事:

在正则表达式中显式使用空间\\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();
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM