在特定字符或最大长度之后分割字符串
本文关键字:之后 分割 字符串 字符 | 更新日期: 2023-09-27 18:09:50
我想按以下方式分割字符串:
string s = "012345678x0123x01234567890123456789";
s.SplitString("x",10);
应该分成
012345678
x0123
x012345678
9012345678
9
。输入字符串应该在字符"x"或长度为10的字符后面分割。
这是我目前为止所做的尝试:
public static IEnumerable<string> SplitString(this string sInput, string search, int maxlength)
{
int index = Math.Min(sInput.IndexOf(search), maxlength);
int start = 0;
while (index != -1)
{
yield return sInput.Substring(start, index-start);
start = index;
index = Math.Min(sInput.IndexOf(search,start), maxlength);
}
}
我将使用这个正则表达式:
([^x]{1,10})|(x[^x]{1,9})
这意味着:
最多匹配10个非
x
的字符,或者匹配x
后最多匹配9个非x
的字符
下面是工作示例:
string regex = "([^x]{1,10})|(x[^x]{1,9})";
string input = "012345678x0123x01234567890123456789";
var results = Regex.Matches(input, regex)
.Cast<Match>()
.Select(m => m.Value);
由您生成值
我个人不喜欢RegEx。它创建的代码很难调试,而且当你第一次看它时很难弄清楚它的目的。因此,对于一个更长的解决方案,我将使用这样的内容。
public static IEnumerable<string> SplitString(this string sInput, char search, int maxlength)
{
var result = new List<string>();
var count = 0;
var lastSplit = 0;
foreach (char c in sInput)
{
if (c == search || count - lastSplit == maxlength)
{
result.Add(sInput.Substring(lastSplit, count - lastSplit));
lastSplit = count;
}
count ++;
}
result.Add(sInput.Substring(lastSplit, count - lastSplit));
return result;
}
注意,我将第一个参数更改为char(从字符串)。这段代码可能可以进一步优化,但它很好,可读性强,这对我来说更重要。