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

时间:2014-07-24 01:25:17

标签: c# regex

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

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

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

感谢。

2 个答案:

答案 0 :(得分:2)

你可以做两件事:

在正则表达式中明确使用空格\s包含奇怪的字符,例如(\n\r\t,...)因此:

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

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

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

在大多数情况下,第一种方法将胜过第二种方法。这是因为第一种方法将所有子串分组为两个或多个空格。正则表达式通常比简单的字符串替换慢一点,但如果字符串包含具有许多空格的序列,则第一种方法会更快。

答案 1 :(得分:2)

在您的示例中,数据按位置分隔,而不是按字符分隔;那是对的吗?如果是这样,你应该按位置提取;类似的东西:

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();
}

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