正则表达式有助于拆分字符串

时间:2014-08-21 18:16:56

标签: c# .net regex string split

我有一个以下格式的字符串:

文件 = " \r\n 6 : size=70 : <Message body> \r\n 4 : size=3 : Test.txt \r\n 17 : size=24 : Test2.txt"

我想写一个正则表达式来去掉所有的空格,然后将字符串拆分成一个字符串数组,如下所示:

stringArray [0] = "6:size=70:<Message body>"

stringArray [1] = "4:size=3:Test.txt"

stringArray [2] = "17:size=24:Test2.txt"

我想这样做:

Regex pattern = new Regex(@"\s", RegexOptions.Compiled);
files = pattern.Replace(files, String.Empty);
string[] scores = files.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

但问题是我的正则表达式甚至会消除&#34; \ r \ n&#34;,所以我无法通过Environment.NewLine将其拆分,所以我该如何实现这种行为呢? / p>

编辑:我忽略了一件事。我希望在分割<Message body>或任何其他拆分字符串时保留空格,所以我实际上需要在最后一个冒号的第一个字符之后但在\ r \ n的最后一个字符之前保留空格...例如, <Message body>Test 3.txt应保留空格。

编辑:我想先拆分前使用正则表达式,

4 个答案:

答案 0 :(得分:2)

在常规表达中'\'匹配空白字符,包括新行,以避免删除新行替换\ s,用一个空格“”这应该给你所需的行为

Regex pattern = new Regex(@" ", RegexOptions.Compiled);

答案 1 :(得分:2)

这是一种没有正则表达式的方法。

string x = " \r\n     6 : size=70 : <Message body> \r\n    4 : size=3 : Test.txt \r\n    17 : size=24 : Test2.txt";

string[] scores = x.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
            .Select(p => p.Trim())
            .Where(p => p!=string.Empty).ToArray();

答案 2 :(得分:2)

从您说明的输入/输出,它看起来我真正想要做的是拆分每个\ r \ n,然后有选择地替换空格。

如果您需要进行regex-&gt;拆分,那么这是一个可行的解决方案(给定非常有限的输入)。

    static void Main(string[] args)
    {
        var s = " \r\n     6 : size=70 : <Message body> \r\n    4 : size=3 : Test.txt \r\n    17 : size=24 : Test2.txt";
        var pattern = "\n.*";

        var match = Regex.Match(s, pattern);

        while (match.Success)
        {
            Console.WriteLine(match.Value.Trim().Replace(" : ", ":"));
            match = match.NextMatch();
        }

        Console.ReadKey();
    }

或者,这是一个单行解决方案,虽然可读性要低得多,IMO:

    static void Main(string[] args)
    {
        var s = " \r\n     6 : size=70 : <Message body> \r\n    4 : size=3 : Test.txt \r\n    17 : size=24 : Test2.txt";
        var pattern = "\n.*";

        Regex.Matches(s, pattern).Cast<Match>().Select(match => match.Value.Trim().Replace(" : ", ":")).ToList().ForEach(Console.WriteLine);

        Console.ReadKey();
    }

答案 3 :(得分:1)

var s = " \r\n     6 : size=70 : <Message body> \r\n    4 : size=3 : Test.txt \r\n    17 : size=24 : Test 2.txt";

var split = s.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

var results = split.Select(x => 
{
    var lastColonIndex = x.LastIndexOf(":");
    int nonWhiteSpaceIndex = lastColonIndex + 1;
    for(; nonWhiteSpaceIndex < x.Length; ++nonWhiteSpaceIndex)
    {
        if(!char.IsWhiteSpace(x[nonWhiteSpaceIndex]))
        {
            nonWhiteSpaceIndex.Dump();
            break;
        }
    }
    return (x.Substring(0, nonWhiteSpaceIndex).Replace(" ", "") + x.Substring(nonWhiteSpaceIndex)).Trim();
}).Where(x => !string.IsNullOrWhiteSpace(x)).Dump();