2013-04-23 2 views
-1

мне нужно найти сумму всех целых чисел в строке:Найти все целые числа в строку C#

bl1a: bl3a: blaspecial: 1 \ г \ nblab7la \ г \ п \ г \ nbla: бла : blaspecial: 4 \ г \ nbl9abla \ г \ п \ г \ nb4la: бла: blaspecial: 2 \ г \ nblabla \ г \ п \ г \ п

Основные правила для int в string является что он начинается с ":", заканчивается "\r\n" и может быть from 1 to 5.

Я пытался играть с SubString, но без каких-либо результатов:

var reg=new Regex("blaspecial", RegexOptions.IgnoreCase); 
var mathes=reg.Matches(tempStr); 
var l=mathes.Count; 
var a=0; 

for(var i=0; i<l; i++) 
{ 
    tempStr=tempStr.Substring(
     tempStr.IndexOf("blaspecial:", StringComparison.Ordinal)+11); 

    var r=tempStr.Substring(0, 1); 
    a=a+int.Parse(r); 
} 
+2

Если вы «играли с подстрокой», наверняка у вас больше всего есть код, который вы можете разделить? – Brian

+0

Покажите свою работу. – abelenky

+1

Я бы играл с 'IndexOf', в частности перегрузкой, которая принимает начальный индекс. – CodesInChaos

ответ

4

Вы можете сделать это, чтобы добавить все целые числа в строке вместе:

var sum = Regex.Matches(input, @"\d+") 
       .Cast<Match>() 
       .Select(m => int.Parse(m.Value)) 
       .Sum(); 

Или это, чтобы ограничить результат только целые числа в схеме :123\r\n

var sum = Regex.Matches(input, @":(\d+)\r\n") 
       .Cast<Match>() 
       .Select(m => int.Parse(m.Groups[1].Value)) 
       .Sum(); 

При вызове с вашей входной строкой оба будут выводить 7.

+1

Чтобы быть в безопасности, регулярное выражение должно включать ':' и '\ r \ n' –

+0

Извините, я забыл скажем, что ints может быть всюду в строке, но мне нужны только те, которые начинаются с: и заканчивается на \ r \ n – Ars

+0

@Ars Я добавил это решение для моего ответа. –

1

Звучит как нечто подходящее для обычного выражения.

^.*:(?<digit>\d)\s*$ 
  • ^ соответствует началу строки.
  • .* соответствует любому символу, ноль или более раз.
  • : соответствует буквальному знаку ':'.
  • (?<digit>) помещает согласованное содержимое в группу digit.
  • \d соответствует одной цифре. (\d+ будет соответствовать одной или нескольким цифрам.)
  • \s* соответствует некоторым пробелам, если он существует.
  • $ соответствует концу строки.

Затем вы используете Regex class с опцией RegexOptions.Multiline. Например:

string input = "bla:bla: blaspecial:1\r\n..."; 

int sum = 0; 
var matches = Regex.Matches(input, @"^.*:(?<digit>\d)\s*$", RegexOptions.Multiline); 
foreach (Match match in matches) 
{ 
    var group = match.Groups["digit"]; 
    if (group.Success) 
    { 
     int value = Int32.Parse(group.Value); 
     sum += value; 
    } 
} 
Console.WriteLine(sum); 

Это будет только те целые числа, которые непосредственно предшествуют : и преуспела пробелами и разделителя строк.

Смежные вопросы