Лучший способ получить все цифры из строки

Есть ли лучший способ получить строку, такую ​​​​как «(123) 455-2344», и получить из нее «1234552344», чем это:

var matches = Regex.Matches(input, @"[0-9]+", RegexOptions.Compiled);

return String.Join(string.Empty, matches.Cast<Match>()
                                .Select(x => x.Value).ToArray());

Возможно, шаблон регулярного выражения, который может сделать это за одно совпадение? Однако я не мог создать его для достижения этого.


person Chris Marisic    schedule 14.04.2010    source источник


Ответы (5)


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

return new String(input.Where(Char.IsDigit).ToArray());
person Matt Hamilton    schedule 14.04.2010
comment
+1, хорошая идея. Однако вы упустили часть лямбды внутри where. .Where(c => Char.IsDigit(c)) - person Anthony Pegram; 14.04.2010
comment
Не рассматривал подход к этому с уровня char. - person Chris Marisic; 14.04.2010
comment
@ Энтони Нет, мой синтаксис работает нормально и менее шумный, чем расширенная версия. - person Matt Hamilton; 14.04.2010
comment
О, интересно. Я так не пробовал. - person Anthony Pegram; 14.04.2010
comment
Проголосуйте за нужно ли вам использовать регулярное выражение: D - person Siewers; 14.10.2013
comment
это обрабатывает числа с плавающей запятой и отрицательные числа? - person BKSpurgeon; 23.11.2017
comment
@BKSpurgeon Нет, char.IsDigit('.') и char.IsDigit('-') оба возвращают false. - person Michael; 12.12.2017
comment
Черт возьми, чувак, к черту регулярное выражение :) - person Jamie Nicholl-Shelley; 03.09.2018

Вы имеете что-то против Replace?

return Regex.Replace(input, @"[^0-9]+", "");
person Alan Moore    schedule 14.04.2010

Вы захотите заменить /\D/ (не цифра) на '' (пустая строка)

Regex r = new Regex(@"\D");
string s = Regex.Replace("(123) 455-2344", r, "");

Или более кратко:

string s = Regex.Replace("(123) 455-2344", @"\D",""); //return only numbers from string
person maček    schedule 14.04.2010
comment
Мне нравится этот ответ. Однако есть ли существенная разница между этим и принятым ответом, кроме одного, использующего Regex, а другого нет? - person frostshoxx; 09.10.2020

Просто удалите все нецифры:

var result = Regex.Replace(input, @"\D", "");
person Konstantin Spirin    schedule 14.04.2010

В Perl (вы можете адаптировать это к С#) просто выполните

$str =~ s/[^0-9]//g; 

Я предполагаю, что ваша строка находится в $str. Основная идея состоит в том, чтобы заменить все нецифры на '' (т.е. пустую строку)

person Jasmeet    schedule 14.04.2010