簡體   English   中英

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

[英]Split string after specific character or after max length

我想通過以下方式拆分字符串:

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(從字符串)。 該代碼可能可以進行更多優化,但是它很好且可讀,對我而言,這更重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM