Regex для удаления всех (не числовой ИЛИ период) - PullRequest
80 голосов
/ 16 июня 2010

Мне нужно, чтобы текст типа "joe ($ 3,004.50)" был отфильтрован до 3004.50, но я ужасен в регулярных выражениях и не могу найти подходящего решения. Так что должны остаться только цифры и периоды - все остальное фильтруется. Я использую C # и VS.net 2008 Framework 3.5

Ответы [ 5 ]

154 голосов
/ 16 июня 2010

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

string s = "joe ($3,004.50)";
s = Regex.Replace(s, "[^0-9.]", "");
31 голосов
/ 16 июня 2010

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

[^0-9.]

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

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

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

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

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

2 голосов
/ 04 декабря 2015

Для принятого ответа 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, ",", "");
}
1 голос
/ 07 декабря 2015

Вы имеете дело со строкой - строка является 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
0 голосов
/ 03 декабря 2015

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

При удалении нецифров или точек строка 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, вы можете сделать еще одну проверку, чтобы увидеть, что соответствующая подстрока имеет не более одной ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...