2012-05-31 3 views
7

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

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

Как я могу извлечь отдельные номера, как «1920» и «1080» от него, при условии, что они будут просто разделены одним или более нечисловой символ (ы)?

+0

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

+0

@Одно хорошо, сделано. – David

ответ

9

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

[0-9]+ 

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

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

foreach(var march in matches) 
{ 
    // match.Value will contain one of the matches 
} 
1
(\d+)\D+(\d+) 

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

+0

'\ d' будет содержать _all_ цифры, а не только римские цифры, в зависимости от библиотеки регулярных выражений и платформы. – Oded

+0

.net/C# (и PCRE's) regex '\ d' соответствует [0-9]. Период. – dda

+0

Нет, это не так. Он будет соответствовать- http://stackoverflow.com/a/6479605/1583 – Oded

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 
+0

хорошо, но часто возвращает лишние пустые строки. – David

+0

Да, обновлено, спасибо @David – Damith

5

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

MatchCollection v = Regex.Matches(input, "[0-9]+"); 
foreach (Match s in v) 
      { 
       // output is s.Value 
      } 
+0

'RegexOptions.IgnoreCase' не требуется. Римские цифры не имеют верхних/нижних регистров. – Oded

+0

Обычно я тренируюсь с RegexOptions.IgnoreCase. Извините за ошибку –

+0

Не ошибка как таковая. Просто не нужно в этом случае. – Oded

0

Существует еще проблема, хотя, все вышеуказанные ответы рассмотрите 12i или a2 действительные числа, когда они ouldn't.

Следующая могли бы решить эту проблему

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); 
} 
Смежные вопросы