如何根据自定义分隔符拆分字符串,同时确保字符串以分隔符结尾?我正在尝试处理传入的客户端数据并尝试分割消息。但是客户端可能会向服务器发送一条消息,该消息由3条较小的消息组成,其中第三条消息尚未完成。即它不包含分隔符,意味着要有更多分界符。
实施例
using System;
public class Test{
private string eofString = "<EOF>";
private string[] eofArray = { "<EOF>" };
public void Main(){
string foo = "bob<EOF>jill<EOF>jake";
string[] splitMessages = foo.Split(eofArray, StringSplitOptions.RemoveEmptyEntries);
for(int i = 0; i < splitMessages.Length; i++){
Console.WriteLine(splitMessages[i]);
}
}
}
输出
bob
jill
jake
我的预期输出是
bob
jill
因为字符串foo
的结尾并未以<EOF>
结尾。
哪个错了。我希望将jake
放回到字符串构建器中。
答案 0 :(得分:1)
您可以使用String.EndsWith来确定字符串是否以分隔符结尾。
答案 1 :(得分:0)
您可以使用此模式进行拆分:
"<EOF>([^\<]*)"
答案 2 :(得分:0)
如果您想要一个基于正则表达式的解决方案,以下内容也可以使用。
string input = "bob<EOF>jill<EOF>jake";
Regex r = new Regex(@"(?<message>.+?)\<EOF\>", RegexOptions.Compiled);
IEnumerable<string> messages = r.Matches(input).Cast<Match>().Select(i => i.Groups["message"].Value);
基本上它是在命名的捕获组.+?
中使用非贪婪匹配模式(?<message> #pattern goes here)
(任何字符中的一个或多个,匹配尽可能少的字符),必须以固定的方式终止字符串<EOF>
。所有匹配都在一个“通行证”中找到,只需要通过捕获组的名称从匹配集合中投射出来。