Разделить строку после определенного символа или после максимальной длины

Я хочу разбить строку следующим образом:

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);
 }
}
</string>
2 ответа

Лично мне не нравится 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;
 }
</string></string>

Примечание. Я изменил первый параметр на символ (из строки). Этот код, вероятно, может быть оптимизирован еще немного, но он приятный и читаемый, что для меня важнее.


Я бы пошел с этим регулярным выражением:

([^x]{1,10})|(x[^x]{1,9})

что значит:

Сопоставьте не более 10 символов, которые не являются x ИЛИ соответствуют x за которым следует не более 9 символов. Tar не 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);
</match>

который дает вам ценности.

licensed under cc by-sa 3.0 with attribution.