从包含字母和空格的字符串中解析整数 - C#

6

如何从包含字母和空格的字符串中有效地解析出整数?

例如:我传递了以下字符串:“RC 272”。我想从字符串中检索出272。

我正在使用C#和.NET 2.0框架。


它是否总是以字母、空格、数字的格式呈现? - Brandon
@Brandon - 是的,它将始终保持这种格式。 - Michael Kniskern
6个回答

29

一个简单的正则表达式可以提取数字,然后你可以解析它:

int.Parse(Regex.Match(yourString, @"\d+").Value, NumberFormatInfo.InvariantInfo);

如果一个字符串可能包含多个数字,您可以使用相同的正则表达式循环遍历找到的匹配项:

for (Match match = Regex.Match(yourString, @"\d+"); match.Success; match = match.NextMatch()) {
    x = int.Parse(match.Value, NumberFormatInfo.InvariantInfo); // do something with it
}

1
我不知道“简单”和“正则表达式”可以在同一个句子中使用而没有语法错误。 - Steven Sudit
1
此外,正则表达式比 indexofsplit 的解决方案更能捕捉到意图,并且它允许通过不匹配模式(通过 match.Success 属性)来更好地处理问题(无效的输入数据),而不是在处理过程中导致无效索引或解析错误。 (抱歉第二条评论,我在第一条评论中用完了字符限制;)) - Lucero
我明白了。然而,我认为正则表达式的性能不应该像人们想象的那样糟糕。如果性能真的很关键,我也不会使用Split()函数,我猜测我提出的“其他”解决方案在这方面可能表现良好。 - Lucero
我想我的担忧是你们两个解决方案都很复杂,要么过度优化,要么欠优化。我会非常满意LFSR的答案,它表现良好且易于维护。 - Steven Sudit
我想这也是品味的问题,而且我真的不明白为什么它们应该更“复杂”。无论如何,我认为如果在生产环境中使用,添加输入验证是必须的。在我的两个解决方案中,都可以更轻松和更清晰地进行验证(在正则表达式中检查match.IsSuccess,在第二个解决方案中检查0或使用标志 - 不会抛出不需要的异常,如IndexOutOfRange)。 - Lucero
显示剩余7条评论

9

因为字符串的格式不会改变,所以要遵循KISS原则

string input = "RC 272";
int result = int.Parse(input.Substring(input.IndexOf(" ")));

5

仅仅是为了好玩,还有另一种可能性:

int value = 0;
foreach (char c in yourString) {
  if ((c >= '0') && (c <= '9')) {
    value = value*10+(c-'0');
  }
}

2
如果它始终采用"ABC 123"的格式:
string s = "RC 272";
int val = int.Parse(s.Split(' ')[1]); // val is 272

1
可以运行,但会创建两个临时字符串,而LFSR的解决方案只创建一个。 - Steven Sudit

0

编辑:

如果它始终保持这种格式,那么类似以下的代码是否可行,其中value =“RC 272”?

int someValue = Convert.ToInt32(value.Substring(value.IndexOf(' ') + 1));

0
各位,既然它总是以“ABC 123”的格式出现,为什么不跳过IndexOf步骤呢?
string input = "RC 272";
int result = int.Parse(input.Substring(3));

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