我有一些字符串:
"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
值
我怎样才能做到这一点?
答案 0 :(得分:4)
将我的评论转到答案:
一种选择是使用否定前瞻,以匹配.
字符后面没有零个或多个[
字符,然后是]
个字符:
\.(?![^[]*\])
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
值
或者,您也可以根据以下表达式匹配,而不是拆分字符串:
[^.]*\[[^]]*\]|[^.]*
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));
}
}