Если вы используете .NET3.5 +, вы можете использовать LINQ
.Решение без Regex (что быстрее) следующее:
var strings = new List<string>() { "82&?", "82,9", "abse82,9>dpkg" };
var result = strings.Select(s =>
String.Join("",
s.Where(c => char.IsNumber(c) || c == ',')
.ToArray()) /* .ToArray() is not needed on .NET 4 */
).ToList();
Он выбирает только символы, которые являются числами или запятыми.Но, учитывая строку 8,1aa1
, она вернет 8,11
.
Этот другой метод немного медленнее, но он займет 8,1
от 8,1aa1
и не будет принимать 8,a
или a,a
:
var strings = new List<string>() { "82&?887..2", "82,9", "abse82,9>dpkg" };
var result = strings.Select(s =>
String.Join("",
s.SkipWhile(c => !char.IsNumber(c))
.TakeWhile(c => (char.IsNumber(c) || c == ','))
.ToArray()
)
).Where(s => char.IsNumber(s.LastOrDefault())).ToList();
Выполнение теста (с использованием секундомера) с 100 000 итераций методами, представленными в ответах, которые я получил:
Fn: BrunoLM (Method 1)
Ticks: 524999
Fn: BrunoLM (Method 2)
Ticks: 729460
Fn: Ahmad
Ticks: 1323366
Fn: Josh
Ticks: 3783158
Тот же тест со строкой длиной 1000 ~:
var strings = new List<string>() { "82&?887..2".PadRight(1000, '2'), "82,9".PadRight(1000, '1'), "abse82,9>dpkg".PadRight(1000, 'f') };
Результат:
Fn: Ahmad
Ticks: 11911332
Fn: BrunoLM (Method 2)
Ticks: 28149495
Fn: Josh
Ticks: 213681541
Дополнительная литература:
регулярное выражение и размер текста n