Устранить буквы или пометить, оставить только цифры и апостроф - PullRequest
1 голос
/ 15 октября 2010

случаи перечислены ниже;

  • 82 &?
  • 82,9
  • abse82,9> dpkg

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

  • 82
  • 82,9
  • 82,9

Пожалуйста, помогите мне сделать это на C # с помощью Regex

Ответы [ 3 ]

3 голосов
/ 15 октября 2010

Если вы используете .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

Дополнительная литература:

regex регулярное выражение и размер текста n

3 голосов
/ 15 октября 2010

Используйте этот шаблон: \d+(,\d+)?.

  • \d: соответствует цифрам от 0-9
  • +: соответствует шаблону хотя бы один раз, поэтому \d+ будет соответствовать хотя бы одной цифре
  • (,\d+)?: указывает на группу (в скобках), которая соответствует запятой, за которой следуют цифры, а , необязательно, соответствует ей (из-за ? в конце группы)

Фрагмент кода:

string[] inputs = { "82&?", "82,9", "abse82,9>dpkg", "foobar" };
foreach (var input in inputs)
{
    Match m = Regex.Match(input, @"\d+(,\d+)?");
    if (m.Success)
    {
        Console.WriteLine(m.Value);
    }
    else
    {
        Console.WriteLine("No match!");
    }
}
1 голос
/ 15 октября 2010

Если вы ищете только этих персонажей и пытаетесь вырвать что-нибудь еще, вы можете сделать следующее

    var strings = new List<string>()
                    {
                        "82&?",
                        "82,9",
                        "abse82,9>dpkg"
                    };
    var reg = new Regex("[^0-9,]*", RegexOptions.None);
    var output = new List<string>();
    foreach(var str in strings)
    {
        output.Add(reg.Replace(str, ""));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...