Извлечь числа из строки, чтобы создать только цифру

Мне даны некоторые плохо отформатированные данные и нужно вытаскивать числа из строк. Я не уверен, что лучший способ сделать это. Номера могут быть любой длины.

string a = "557222]]>";
string b = "5100870<br>";

любая идея, что я могу сделать, я получу это:

a = "557222"
b = "5100870"

Спасибо

Решение для С# извините. Отредактировал вопрос, чтобы этот тег

Ответ 1

Не достаточно хорошо знаком с .NET для точного кода. Тем не менее, два подхода:

  • Передайте его как целое число. Если символы без цифр заканчиваются (т.е. 21389abc), это самый простой.
  • Если вы смешали нецифровые символы (т.е. 1231a23v) и хотите сохранить каждую цифру, используйте regex [^\d] для замены нецифровых символов.

Ответ 2

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

public string ExtractNumber(string original)
{
     return new string(original.Where(c => Char.IsDigit(c)).ToArray());
}

Это чисто выводит "цифры" - вы также можете использовать Char.IsNumber вместо Char.IsDigit, в зависимости от желаемого результата.

Ответ 3

попробуйте этот oneliner: Regex.Replace(str, "[^ 0-9 _]", "");

Ответ 4

Вы можете использовать простое регулярное выражение:

var numericPart = Regex.Match( a, "\\d+" ).Value;

Если вам нужно, чтобы это было фактическое числовое значение, вы можете использовать int.Parse или int.TryParse.

Ответ 5

Вы можете использовать LINQ. Код ниже фильтрует строку в IEnumerable только с цифрами, а затем преобразует ее в char []. Конструктор строк затем может преобразовать char [] в строку:

string a = "557222]]>";
string b = "5100870<br>";

a = new string(a.Where(x => char.IsDigit(x)).ToArray());
b = new string(b.Where(x => char.IsDigit(x)).ToArray());

Ответ 6

Попробуйте это

string number = Regex.Match("12345<br>", @"\d+").Value;

Это вернет первую группу цифр. Пример: для ввода "a 123 b 456 c" он вернет "123".

Ответ 7

В вопросе явно не указано, что вы просто хотите, чтобы символы от 0 до 9, но не было бы верным, что это правда из вашего набора примеров и комментариев. Итак, вот код, который делает это.

        string digitsOnly = String.Empty;
        foreach (char c in s)
        {
            // Do not use IsDigit as it will include more than the characters 0 through to 9
            if (c >= '0' && c <= '9') digitsOnly += c;
        }

Почему вы не хотите использовать Char.IsDigit() - Числа включают символы, такие как дроби, индексы, надстрочные индексы, римские цифры, числители чисел, окруженные номера и script -специфические цифры.

Ответ 8

Вот версия, которая работала для моего случая

    public static string ExtractNumbers(this string source)
    {
        if (String.IsNullOrWhiteSpace(source))
            return string.Empty;
        var number = Regex.Match(source, @"\d+");
        if (number != null)
            return number.Value;
        else
            return string.Empty;
    }

Ответ 9

Мне нравится работать с методами расширений всегда, когда я манипулирую нативными объектами, такими как string, int, datetime и т.д.

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

namespace System
{
  public static class StringExtension
  {

    public static string GetNumbers(this string str)
    {
        if( str != null)
        {
            var justNumbers = new String(str.Where(c => Char.IsDigit(c)).ToArray());
            return justNumbers;
        } //if

        return "";

    } //GetNumbers


    public static string GetLetters(this string str)
    {

        if( str != null)
        {
            var justLetters = new String(str.Where(c => Char.IsLetter(c)).ToArray());
            return justLetters;
        } //if

        return "";

    } //GetLetters

  } //class

} //namespace

Использовать просто:

string myStr = "A0B1C2D3F";
string myStrJustNumbers = myStr.GetNumbers();

/* myStrJustNumbers  = "0123" */