Regex удалить все (не числовой период OR)

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

Ответ 1

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

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

Ответ 2

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

[^0-9.]

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

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

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

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

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

Ответ 3

Для принятого ответа 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, ",", "");
}

Ответ 4

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

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

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

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

Ответ 5

Вы имеете дело со строкой - это 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