2013-03-13 4 views
3
List<int> ids = ExtractIds("United Kingdom (656) - Aberdeen (7707)"); 

Вышеприведенный список должен быть заполнен описанным ниже способом, который разделяет значения из круглых скобок.Как преобразовать регулярное выражение match.Value в integer?

Если я использую match.Value как строку и присваиваю ей список < string> он работает нормально. Но когда я пытаюсь преобразовать его в целое число, я получаю ошибку: «Строка ввода не была в правильном формате».

Что я делаю неправильно?

public List<int> ExtractIds(string str) 
{ 
    MatchCollection matchCollection = Regex.Matches(str, @"\((.*?)\)"); 
    List<int> ExtractedIds = new List<int>(); 
    foreach (Match match in matchCollection) 
    { 
     int theid = int.Parse(match.Value); 
     ExtractedIds.Add(theid); 
    } 

    return ExtractedIds; 
} 
+1

в других языках 0-й матч представляет собой полную строку соответствия ... Непонятно, что C#, но кажется хорошим местом для поиска – Lucas

+0

Вы скопируете что-нибудь в скобках - вы, вероятно, хотите '\ d +' вместо '. *? '. – cfeduke

+2

Вы не используете отладчик. Узнайте, что такое match.Value * is *, и вы поймете, что пошло не так. – nvoigt

ответ

9

Использование match.Groups[1].Value вместо match.Value, чтобы просто получить строку, найденную в скобках - т.е. не включая сами скобки.

Используйте \d*? вместо .?*, чтобы убедиться, что вы только соответствуете цифрам, а не в скобках!

Вам больше не нужен ?, потому что \d не соответствует закрывающей скобе.

Вместо переключения смотреть в Groups[1], вы можете использовать lookarounds в регулярном выражении, таких как

(?<=\()\d(?=\)) 

, чтобы убедиться, что Match содержит только сами цифры.

+0

В качестве альтернативы вы можете использовать именованные группы захвата вместо целых индексированных групп - имейте в виду 'match.Groups [2]' или более, также может существовать, а также нет совпадений. Ваш код должен учитывать это. – cfeduke

+0

Yup - с таким простым регулярным выражением, что я не стал бы слишком беспокоиться, но что-то более сложное, и я бы подумал об именовании захвата. – Rawling

+0

Большое спасибо всем за информативные ответы и примеры - все хорошо сейчас и с некоторыми ценными улучшениями. –

0

Если вы отлаживаете свой код, вы получаете match.Value включает в себя скобки вокруг номера, это, очевидно, приведет к исключению.

переписать шаблон как @ "(\ d) +" это будет группировать ваш номер, но игнорировать скобки.

public List<int> ExtractIds(string str) 
{ 
    MatchCollection matchCollection = Regex.Matches(str, @"(\d)+"); 
    List<int> ExtractedIds = new List<int>(); 
    foreach (Match match in matchCollection) 
    { 
     int theid = int.Parse(match.Value); 
     ExtractedIds.Add(theid); 
     } 
     return ExtractedIds; 
} 

Надеюсь, это поможет.

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