在'上拆分字符串。'不在[]括号内的点字符

时间:2016-02-15 20:36:36

标签: c# .net regex string split

我有一些字符串:

"Item.ObjectA.ObjectBs[Id=1234;Name=Test;Date=12.05.2016 11:11:11].ObjectD.Value"

如果我将其与.分开,则会给出:

  

项目

     

对象A

     

ObjectBs [Id = 1234; Name = Test; Date = 12

     

05

     

2016 11:11:11]

     

ObjectD

     

但我想要一个结果,忽略[]内的点,即:

  

项目

     

对象A

     

ObjectBs [Id = 1234; Name = Test; Date = 12.05.2016 11:11:11]

     

ObjectD

     

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:4)

将我的评论转到答案:

一种选择是使用否定前瞻,以匹配.字符后面没有零个或多个[字符,然后是]个字符:

\.(?![^[]*\])

Live Example

string pattern = @"\.(?![^[]*\])";
string input = "Item.ObjectA.ObjectBs[Id=1234;Name=Test;Date=12.05.2016 11:11:11].ObjectD.Value";

foreach (String split in Regex.Split(input, pattern))
{
    Console.WriteLine(split);
}

输出:

  

项目

     

对象A

     

ObjectBs [Id = 1234; Name = Test; Date = 12.05.2016 11:11:11]

     

ObjectD

     

或者,您也可以根据以下表达式匹配,而不是拆分字符串:

[^.]*\[[^]]*\]|[^.]*

Live Example

string pattern = @"[^.]*\[[^]]*\]|[^.]*";
string input = "Item.ObjectA.ObjectBs[Id=1234;Name=Test;Date=12.05.2016 11:11:11].ObjectD.Value";
foreach (Match match in Regex.Matches(input, pattern))
{
    Console.WriteLine(match.Value);
}

相同的输出。

答案 1 :(得分:0)

这个答案显示了如何在纯编程中完成它

this

结果 using System; using System.Collections.Generic; using System.Text; using System.Linq; public class Program { public static void Main() { var orig = "Item.ObjectA.ObjectBs[Id=1234;Name=Test;Date=12.05.2016 11:11:11].ObjectD.Value"; var parts = new List<string>(); var stop = false; var current = new StringBuilder(); for (int i = 0; i < orig.Length; i++) { if (orig[i] != '.') current.Append(orig[i]); if (orig[i] == '[') stop = true; if (orig[i] == ']') stop = false; if ((orig[i] == '.' && !stop) || i == orig.Length - 1) { parts.Add(current.ToString()); current.Length = 0; } } parts.ForEach(x => Console.WriteLine(x)); } }