Вопрос по .net, c#, regex – Использование регулярных выражений для извлечения нескольких чисел из строк

7

У меня есть строка с двумя или более числами. Вот несколько примеров:

"(1920x1080)"
" 1920 by 1080"
"16 : 9"

Как я могу извлечьseparate числа, подобные «1920» и "1080" Исходя из этого, предполагая, что они будут просто отделены одним или несколькими нечисловыми символами?

Пожалуйста, решите, на каком языке вам нужен ответ. Объекты регулярных выражений в .NET не совпадают с объектами Java. Oded
@ Хорошо, готово. David

Ваш Ответ

5   ответов
1
(\d+)\D+(\d+)

После этого настройте это регулярное выражение так, чтобы оно соответствовало языку, который вы будете использовать.

Не могли бы вы объяснить преимущество этого по сравнению с Regex.Matches (s, & quot; [0-9] + & quot;) ;? David
регулярные выражения .net / C # (и PCRE)\d соответствует [0-9]. Период.
Нет, это не так. Он будет совпадать с & # x660; & # x661; & # x662; & # x663; & # x6664; & # x665; & # x666; & # x667; & # x668; & # x669; -stackoverflow.com/a/6479605/1583
@Oded Ваш первый комментарий смутил меня, пока я не понял, что вы не имели в видуI, II, ... VII и т.д. Не является ли арабский 0-9?
\d будет содержатьall цифры, а не только римские цифры, в зависимости от библиотеки регулярных выражений и платформы.
5

Вы можете получить строку, следуя

MatchCollection v = Regex.Matches(input, "[0-9]+");
foreach (Match s in v)
            {
                // output is s.Value
            }
Не ошибка как таковая. Просто не нужно в этом случае.
RegexOptions.IgnoreCase не нужен Римские цифры не имеют прописных / строчных букв.
Обычно я практикуюсь с RegexOptions.IgnoreCase. Извини за ошибку
0

Тем не менее, существует проблема, все приведенные выше ответы учитывают действительные числа 12i или a2, когда они не должны.

Следующее может решить эту проблему

var matches = Regex.Matches(input, @"(?:^|\s)\d+(?:\s|$)");

Но это решение добавляет еще одну проблему :) Это захватит пробелы вокруг целого числа. Чтобы решить эту проблему, нам нужно захватить значение целого числа в группу:

MatchCollection matches = Regex.Matches(_originalText, @"(?:^|\s)(\d+)(?:\s|$)");
HashSet<string> uniqueNumbers = new HashSet<string>();
foreach (Match m in matches)
{
    uniqueNumbers.Add(m.Groups[1].Value);
}
1

ты можешь использовать

string[] input = {"(1920x1080)"," 1920 by 1080","16 : 9"};
foreach (var item in input)
{
    var numbers = Regex.Split(item, @"\D+").Where(s => s != String.Empty).ToArray();
    Console.WriteLine("{0},{1}", numbers[0], numbers[1]);
}

ВЫХОД:

1920,1080
1920,1080
16,9
Да, обновлено, спасибо @David
хорошо, но часто возвращает лишние пустые строки. David
10

Основное регулярное выражение будет:

[0-9]+

Вам нужно будет использовать библиотеку, чтобы просмотреть все совпадения и получить их значения.

var matches = Regex.Matches(myString, "[0-9]+");

foreach(var march in matches)
{
   // match.Value will contain one of the matches
}

Похожие вопросы