разбить строку без разделителя - PullRequest
3 голосов
/ 08 сентября 2011

У меня есть строковая переменная со значением "abcdefghijklmnop".

теперь я хочу разбить строку на строковый массив, скажем, по 3 символа (последний элемент массива может содержать меньше) в каждом элементе массива с правого конца.

т.е.,
"a"
"bcd"
"efg"
"hij"
"klm"
"nop"

Какой самый простой и простой способ сделать это ??(оба кода vb и C # приветствуются)

Ответы [ 4 ]

4 голосов
/ 08 сентября 2011

Вот решение:

var input = "abcdefghijklmnop";
var result = new List<string>();
int incompleteGroupLength = input.Length % 3;
if (incompleteGroupLength > 0)
    result.Add(input.Substring(0, incompleteGroupLength));
for (int i = incompleteGroupLength; i < input.Length; i+=3)
{
    result.Add(input.Substring(i,3));
}

Дает ожидаемый результат:

"a"
"bcd"
"efg"
"hij"
"klm"
"nop"
1 голос
/ 08 сентября 2011

Вот то, что работает - заключено в функцию расширения строки.

namespace System
{
    public static class StringExts
    {
        public static IEnumerable<string> ReverseCut(this string txt, int cutSize)
        {
            int first = txt.Length % cutSize;
            int taken = 0;

            string nextResult = new String(txt.Take(first).ToArray());
            taken += first;
            do
            {
                if (nextResult.Length > 0)
                    yield return nextResult;

                nextResult = new String(txt.Skip(taken).Take(cutSize).ToArray());
                taken += cutSize;
            } while (nextResult.Length == cutSize);

        }
    }
}

Использование:

            textBox2.Text = "";
            var txt = textBox1.Text;

            foreach (string s in txt.ReverseCut(3))
                textBox2.Text += s + "\r\n";   
1 голос
/ 08 сентября 2011

Регулярное время !!

Regex rx = new Regex("^(.{1,2})??(.{3})*$");

var matches = rx.Matches("abcdefgh");

var pieces = matches[0].Groups[1].Captures.OfType<Capture>().Select(p => p.Value).Concat(matches[0].Groups[2].Captures.OfType<Capture>().Select(p => p.Value)).ToArray();

штук будет содержать:

"ab"
"cde"
"fgh"

(пожалуйста, не используйте этот код! Это только пример того, что может случиться, когда вы используете Regex + Linq)

0 голосов
/ 09 сентября 2011

хорошо .. есть еще один способ, которым я достиг ..

private string[] splitIntoAry(string str)
    {
        string[] temp = new string[(int)Math.Ceiling((double)str.Length / 3)];
        while (str != string.Empty)
        {
            temp[(int)Math.Ceiling((double)str.Length / 3) - 1] = str.Substring(str.Length - Math.Min(str.Length, 3));
            str = str.Substring(0, str.Length - Math.Min(str.Length, 3));
        }
        return temp;
    }
...