我想问一个关于String.Split的问题
例如:
char[] semicolon=new [] {';'};
char[] bracket=new [] {'[',']'};
string str="AND[Firstpart;Sndpart]";
我可以用括号分割str,然后用分号分割。 最后,我将Firstpart和Sndpart放在括号中。
但如果str="AND[AND[Firstpart;Sndpart];sndpart];
如何获得AND[Firpart;Sndpart]
和sndpart
?
有没有办法告诉c#用第二个分号分割?
感谢您的帮助
答案 0 :(得分:1)
一种方法是使用未在任何字符串中使用的字符隐藏括号内的字符。
方法HideSplit
:此方法将使用伪造的方式更改括号内的分隔符。然后它将执行拆分并将原始字符返回结果。
如果您想多次执行此操作,此方法可能过度。但如果你有了这个想法,你应该能够轻松地优化它。
private static void Main()
{
char[] semicolon = new[] { ';' };
char[] bracket = new[] { '[', ']' };
string str = "AND[AND[Firstpart;Sndpart];sndpart]";
string[] splitbyBracket = HideSplit(str, bracket);
}
private static string[] HideSplit(string str,char[] separator)
{
int counter = 0; // When counter is more than 0 it means we are inside brackets
StringBuilder result = new StringBuilder(); // To build up string as result
foreach (char ch in str)
{
if(ch == ']') counter--;
if (counter > 0) // if we are inside brackets perform hide
{
if (ch == '[') result.Append('\uFFF0'); // add '\uFFF0' instead of '['
else if (ch == ']') result.Append('\uFFF1');
else if (ch == ';') result.Append('\uFFF2');
else result.Append(ch);
}
else result.Append(ch);
if (ch == '[') counter++;
}
string[] split = result.ToString().Split(separator); // Perform split. (characters are hidden now)
return split.Select(x => x
.Replace('\uFFF0', '[')
.Replace('\uFFF1', ']')
.Replace('\uFFF2', ';')).ToArray(); // unhide characters and give back result.
// dont forget: using System.Linq;
}
一些例子:
string[] a1 = HideSplit("AND[AND[Firstpart;Sndpart];sndpart]", bracket);
// Will give you this array { AND , AND[Firstpart;Sndpart];sndpart }
string[] a2 = HideSplit("AND[Firstpart;Sndpart];sndpart", semicolon);
// Will give you this array { AND[Firstpart;Sndpart] , sndpart }
string[] a3 = HideSplit("AND[Firstpart;Sndpart]", bracket);
// Will give you this array { AND , Firstpart;Sndpart }
string[] a4 = HideSplit("Firstpart;Sndpart", semicolon);
// Will give you this array { Firstpart , Sndpart }
你可以继续以这种方式分裂。
答案 1 :(得分:0)
有没有办法告诉c#用第二个分号分割?
没有直接的方法可以做到这一点,但如果这正是你想要的,那就不难实现:
string str="AND[AND[Firstpart;Sndpart];sndpart];
string[] tSplits = str.Split(';', 3);
string[] splits = { tSplits[0] + ";" + tSplits[1], tSplits[2] };
您可以使用IndexOf()
和Substring()
的组合获得相同的结果,但这很可能不是您最终会使用的结果,因为它太具体而且对各种输入没有多大帮助。
对于您的情况,您需要了解上下文的内容。
在现实世界的复杂案例中,您可能会使用lexer / parser,但这似乎有点过分。
你最大的努力可能是使用一个循环,在计算+/-方括号时遍历所有字符并在找到分号和分数时分割。伯爵是1。
答案 2 :(得分:0)
您可以使用Regex.Split
,这是一种更灵活的String.Split
形式:
string str = "AND[AND[Firstpart;Sndpart];sndpart]";
string[] arr = Regex.Split(str, @"(.*?;.*?;)");
foreach (var s in arr)
Console.WriteLine("'{0}'", s);
// output: ''
// 'AND[AND[Firstpart;Sndpart];'
// 'sndpart]'
Regex.Split
不是通过字符拆分,而是通过匹配正则表达式的字符串拆分,因此它归结为构建满足特定要求的正则表达式模式。分割为第二个分号实际上是以一个以分号结尾的字符串进行拆分,之前包含另一个分号,因此分割输入字符串的匹配模式可以是:(.*?;.*?;)
。
返回的数组有三个元素而不是两个元素,因为拆分正则表达式匹配输入字符串的开头,在这种情况下,空字符串作为第一个元素返回。
您可以在msdn上的Regex.Split
上阅读更多内容。