Регулярное выражение для удаления всех (не числовое ИЛИ точка)


97

Мне нужно, чтобы текст типа «Джо (3 004,50 долларов США)» был отфильтрован до 3004,50, но я ужасен в регулярных выражениях и не могу найти подходящего решения. Таким образом, должны оставаться только числа и точки - все остальное отфильтровано. Я использую C # и VS.net 2008 framework 3.5

Ответы:


172

Это должно сделать это:

string s = "joe ($3,004.50)";
s = Regex.Replace(s, "[^0-9.]", "");

2
О чем joe.smith ($3,004.50)? Простое удаление проблемных классов символов может пойти не так.
Мэтью Ганн

2
Вношу одно небольшое исправление: Regex.Replace(s, "[^$0-9.]", "");вы хотите оставить знак доллара.
bodacydo

37

Регулярное выражение:

[^0-9.]

Вы можете кэшировать регулярное выражение:

Regex not_num_period = new Regex("[^0-9.]")

затем используйте:

string result = not_num_period.Replace("joe ($3,004.50)", "");

Однако вы должны иметь в виду, что в некоторых культурах существуют разные правила записи денежных сумм, например: 3,004,50.


Банкомат слишком ленив для проверки, но вам не нужно избегать. ?
Эндрю Андерсон

9
@Andrew: нет, внутри класса символов .не имеет особого значения.
Барт Кирс,

3

Вы имеете дело со строкой - строка - это строка IEumerable<char>, поэтому вы можете использовать LINQ:

var input = "joe ($3,004.50)";
var result = String.Join("", input.Where(c => Char.IsDigit(c) || c == '.'));

Console.WriteLine(result);   // 3004.50

2

Для принятого ответа MatthewGunn поднимает допустимую точку в том, что все цифры, запятые и точки во всей строке будут объединены вместе. Это позволит избежать:

string s = "joe.smith ($3,004.50)";
Regex r = new Regex(@"(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)/)");
Match m = r.match(s);
string v = null;
if (m.Success) {
  v = m.Groups[1].Value;
  v = Regex.Replace(v, ",", "");
}

Кажется, что у регулярного выражения есть лишние скобки. Использование (?:^|[^w.,])(\d[\d,.]+)(?=\W|$)также будет соответствовать "h25" в строке "joe.smith25 (3 004,50 $)"
Ривка

1

Подход удаления оскорбительных символов потенциально проблематичен. Что, если где-то .в строке есть другой ? Он не будет удален, хотя должен!

Если удалить не цифры или точки, строка joe.smith ($3,004.50)превратится в неразборчивую .3004.50.

Имхо, лучше сопоставить определенный шаблон и извлечь его с помощью группы. Что-то простое - найти все смежные запятые, цифры и точки с помощью регулярного выражения:

[\d,\.]+

Пример пробного запуска:

Pattern understood as:
[\d,\.]+
Enter string to check if matches pattern
>  a2.3 fjdfadfj34  34j3424  2,300 adsfa    
Group 0 match: "2.3"
Group 0 match: "34"
Group 0 match: "34"
Group 0 match: "3424"
Group 0 match: "2,300"

Затем для каждого совпадения удалите все запятые и отправьте их синтаксическому анализатору. Чтобы обработать случай чего-то вроде этого 12.323.344, вы можете сделать еще одну проверку, чтобы убедиться, что в соответствующей подстроке есть не более одного ..


Это регулярное выражение соответствует всему.
mindriot

Теперь он соответствует всему, кроме "".
mindriot

1
Предлагаемая вами концепция потребует сложного регулярного выражения, которое трудно читать и отлаживать. Возможно, будет лучше разбить его на шаги с несколькими регулярными выражениями и условными выражениями. Я мог бы дать ответ (хотя и написан на Ruby, так как я не знаю C #.
mindriot

@mindriot Точка взята. Поменял на что-то более прозрачное.
Мэтью Ганн

Под отправкой парсеру вы имеете в виду либо Single.Parse()или Single.TryParse?
mindriot
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.