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