在特定字符或最大长度之后分割字符串

本文关键字:之后 分割 字符串 字符 | 更新日期: 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(从字符串)。这段代码可能可以进一步优化,但它很好,可读性强,这对我来说更重要。