如何将正则表达式匹配的值转换为整数?

4
List<int> ids = ExtractIds("United Kingdom (656) - Aberdeen (7707)");

上面的列表应通过以下方法填充,该方法从括号内提取值。
如果我将match.Value作为字符串并将其分配给List< 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
你正在匹配括号中的任何内容 - 你可能想要使用\d+而不是.*? - cfeduke
2
你没有使用调试器。找出match.Value 是什么,你就会知道出了什么问题。 - nvoigt
2个回答

10

使用 match.Groups [1].Value 而不是 match.Value,以获取括号内找到的字符串 - 即不包括括号本身。

使用 \d*? 而不是 .?* 来确保只匹配数字,而不是括号中的任何内容!

然后你甚至不再需要 ? ,因为 \d 不匹配闭括号。

可以在正则表达式中使用 lookarounds,而无需切换到 Groups [1].

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

确保Match仅包含数字本身。


你也可以使用命名捕获组代替整数索引组 - 请记住,match.Groups[2] 或更多可能存在,也可能没有匹配。你的代码应该考虑到这一点。 - cfeduke
是的 - 对于像这样简单的正则表达式,我不会太担心,但如果更复杂一些,我会考虑为捕获命名。 - Rawling
非常感谢大家提供的信息性回答和示例 - 现在一切都很好,并有了一些宝贵的改进。 - Martin Hansen Lennox

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;
 }

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接