Подтвердить что ты не робот

Есть ли способ лучше разбирать строки?

Мне интересно, существует ли встроенный способ .NET для анализа битов строки.

Возьмем, например, следующую строку:

"bsarbirthd0692"

состоит из следующих частей, которые позже будут привязаны к данным:

Indexes   Purpose
0-3       (name)
4-9       (description)
10-13     (date mm-yy)

Я надеюсь на что-то родное вроде:

string name, desc, date;
string.ParseFormat("{0:4}{1:5}{2:4}", "bsarbirthd0692", out name, out desc, out date);

Есть ли собственный способ сделать это в .NET или в популярной библиотеке?

4b9b3361

Ответ 1

Поскольку формат известен и не должен меняться Подстрока должна работать для вас

string data = "bsarbirthd0692";
string name, desc, date;
name = data.Substring(0, 4);
desc = data.Substring(4, 6);
date = data.SubString(10);

ИЗМЕНИТЬ

Существуют также методы расширения, которые вы можете создать, чтобы делать то, что вы хотите. Это, очевидно, более сложно, чем предыдущее предложение

public static class StringExtension
{
    /// <summary>
    /// Returns a string array of the original string broken apart by the parameters
    /// </summary>
    /// <param name="str">The original string</param>
    /// <param name="obj">Integer array of how long each broken piece will be</param>
    /// <returns>A string array of the original string broken apart</returns>
    public static string[] ParseFormat(this string str, params int[] obj)
    {
        int startIndex = 0;
        string[] pieces = new string[obj.Length];
        for (int i = 0; i < obj.Length; i++)
        {
            if (startIndex + obj[i] < str.Length)
            {
                pieces[i] = str.Substring(startIndex, obj[i]);
                startIndex += obj[i];
            }
            else if (startIndex + obj[i] >= str.Length && startIndex < str.Length)
            {
                // Parse the remaining characters of the string
                pieces[i] = str.Substring(startIndex);
                startIndex += str.Length + startIndex;
            }

            // Remaining indexes, in pieces if they're are any, will be null
        }

        return pieces;
    }
}

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

string d = "bsarbirthd0692";
string[] pieces = d.ParseFormat(4,6,4);

Результат:

enter image description here

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

string d = "bsarbirthd0692";
string[] pieces = d.ParseFormat(4,6,4,1,2,3);

Результаты:

enter image description here

Ответ 2

Вы можете использовать Regexp для этого

string str= "bsarbirthd0692";
var regex = "(?<name>.{4})(?<desc>.{6})(?<date>.{4})";
MatchCollection matches = Regex.Matches(str, regex);
foreach(Match m in matches){
    Console.WriteLine(m.Groups["name"].ToString());
    Console.WriteLine(m.Groups["desc"].ToString());
    Console.WriteLine(m.Groups["date"].ToString());
}

Ответ 3

Нет ничего подобного, но пишу что-то для реализации:

IEnumerable<string> inputString.BreakIntoLengths(4, 6, 4)

с сигнатурой:

public IEnumerable<string> BreakIntoLengths(this string input, params int[] lengths);

очень просто:

public IEnumerable<string> BreakIntoLengths(this string input, params int[] lengths) {

  var pos = 0;
  foreach (var len in lengths) {
    yield return input.Substring(pos, len);
    pos += len;
  }
}

(с реальной реализацией, имеющей некоторую проверку ошибок.)

NB. Я отбросил строку формата, такую ​​как интерфейс: он, похоже, не имеет значения. После возврата коллекции легко присваивать записи индексом.

Ответ 4

Лучше от чего? Что-то вроде этого?

var listStrings = new List<string>();
var tempIndex = 0;
var indexList = new List<int>{4, 6, 4}
foreach(var length in indexList)
{
    listStrings.Add(string.Substring(tempIndex , length);
    tempIndex += length 
}

Ответ 5

Нет, нет встроенного способа. Я бы использовал строковые методы, например Substring:

string name, desc, date;
if (input.Length >= 4)
{
    name = input.Substring(0, 4);
    if (input.Length >= 10)
    {
        desc = input.Substring(4, 6);
        if (input.Length >= 14)
        {
            date = input.Substring(10, 4);
        }
    }
}