Как отделить символьную и числовую часть от строки

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

13
задан SethO 7 October 2012 в 17:48
поделиться

6 ответов

Я использовал ответ bniwredyc, чтобы получить Улучшенную версию моей рутины:

    private void demo()
        {
            string cell = "ABCD4321";
            int row, a = getIndexofNumber(cell);
            string Numberpart = cell.Substring(a, cell.Length - a);
            row = Convert.ToInt32(Numberpart);
            string Stringpart = cell.Substring(0, a);
        }

        private int getIndexofNumber(string cell)
        {
            int indexofNum=-1;
            foreach (char c in cell)
            {
                indexofNum++;
                if (Char.IsDigit(c))
                {
                    return indexofNum;
                }
             }
            return indexofNum;
        }
1
ответ дан 1 December 2019 в 18:06
поделиться

Регулярные выражения лучше всего подходят для такого рода работ:

using System.Text.RegularExpressions;

Regex re = new Regex(@"([a-zA-Z]+)(\d+)");
Match result = re.Match(input);

string alphaPart = result.Groups[1].Value;
string numberPart = result.Groups[2].Value;
23
ответ дан 1 December 2019 в 18:06
поделиться

Используйте Linq для этого

string str = "OS234";

var digits = from c in str
             select c
             where Char.IsDigit(c);

var alphas = from c in str
             select c
             where !Char.IsDigit(c);
10
ответ дан 1 December 2019 в 18:06
поделиться

Каждый и его мать дадут вам решение с использованием регекса, так что вот это не так:

 // s is string of form ([A-Za-z])*([0-9])* ; char added
 int index = s.IndexOfAny(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' });
 string chars = s.Substring(0, index);
 int num = Int32.Parse(s.Substring(index));
3
ответ дан 1 December 2019 в 18:06
поделиться

Вы делаете это в целях сортировки? Если да, то имейте в виду, что регекс может убить производительность для больших списков. Я часто использую AlphanumComparer, который является общим решением этой проблемы (может обрабатывать любую последовательность букв и цифр в любом порядке). Я считаю, что адаптировал его из этой страницы.

Даже если вы не сортируете его по символам (если у вас есть переменные длины). или простая подстрока/разделение (если они исправлены) будет намного эффективнее и проще в тестировании, чем регекс.

.
1
ответ дан 1 December 2019 в 18:06
поделиться

.NET 2.0 совместимый, без регекса

public class Result
{
    private string _StringPart;
    public string StringPart
    {
        get { return _StringPart; }
    }

    private int _IntPart;
    public int IntPart
    {
        get { return _IntPart; }
    }

    public Result(string stringPart, int intPart)
    {
        _StringPart = stringPart;
        _IntPart = intPart;
    }
}

class Program
{
    public static Result GetResult(string source)
    {
        string stringPart = String.Empty;
        int intPart;
        var buffer = new StringBuilder();
        foreach (char c in source)
        {
            if (Char.IsDigit(c))
            {
               if (stringPart == String.Empty)
               {
                    stringPart = buffer.ToString();
                    buffer.Remove(0, buffer.Length);
                }
            }

            buffer.Append(c);
        }

        if (!int.TryParse(buffer.ToString(), out intPart))
        {
            return null;
        }

        return new Result(stringPart, intPart); 
    }

    static void Main(string[] args)
    {
        Result result = GetResult("OS234");
        Console.WriteLine("String part: {0} int part: {1}", result.StringPart, result.IntPart);
        result = GetResult("AA4230 ");
        Console.WriteLine("String part: {0} int part: {1}", result.StringPart, result.IntPart);
        result = GetResult("ABCD4321");
        Console.WriteLine("String part: {0} int part: {1}", result.StringPart, result.IntPart);
        Console.ReadKey();
    }
}
1
ответ дан 1 December 2019 в 18:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: