Извлечь числа из строки, чтобы создать только цифру
Мне даны некоторые плохо отформатированные данные и нужно вытаскивать числа из строк. Я не уверен, что лучший способ сделать это. Номера могут быть любой длины.
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" */