从C#中的较长字符串解析此数字的最佳方法是什么?

时间:2013-03-02 04:20:27

标签: c# regex string parsing

我有以下示例字符串

"CTS3010 - 6ppl"

"CTs3200 - 14ppl"

 "CTS-500 2ppl"

我需要解析这些字符串中的数字。在字符串末尾的“ppl”之前解析数字的最佳方法是什么。我需要正则表达式吗?我有向后循环的逻辑,但感觉这里有一个更优雅的解决方案。

这些只是示例,但所有示例似乎都遵循相同的模式

  • 一堆文字
  • 一个数字
  • ppl后缀

3 个答案:

答案 0 :(得分:6)

您可以在“ppl”之前抓取数字:

using System.Text.RegularExpressions;
...

Regex regex = new Regex("([0-9]+)ppl");
string matchedValue = regex.Match("CTS-500 122ppl").Groups[1].Value;

在这种情况下,matchedValue将是122.

如果您想要安全,并且您知道“ppl”将始终位于字符串的末尾,我会将正则表达式更改为:"([0-9]+)ppl$"(唯一的区别是最后的美元符号)

答案 1 :(得分:1)

这是使用LINQ的一种方式:

const String ppl = "ppl";
var examples = new[] { "CTS3010 - 6ppl", "CTs3200 - 14ppl", "CTS-500 2ppl" };
var delimiters = new[] { " " };
var result = examples
    .Select(e => e.Split(delimiters, StringSplitOptions.RemoveEmptyEntries))
    .Select(t => t.Last().ToLowerInvariant().Replace(ppl, String.Empty))
    .Select(Int32.Parse)
    .ToList();

请注意,如果无法解析整数值,则会失败。如果您不能保证每个字符串都以NNppl结尾,则您需要先检查它是否为数值。

答案 2 :(得分:0)

我不知道“最好的方法”,但是一个非常容易理解和修改的方法是字符串对象的扩展方法:

 public static int Parse(this string phrase)
    {
        if (string.IsNullOrWhiteSpace(phrase)) { throw new NullReferenceException("phrase is null");}

        string num = string.Empty;
        foreach (char c in phrase.Trim().ToCharArray()) {
            if (char.IsWhiteSpace(c)) { break; }
            if (char.IsDigit(c)) { num += c.ToString(); }
        }
        return int.Parse(num);
    }

假设“”是休息状态。如果你有可能没有得到一个数字和/或可能是System.Text.StringBuilder,你可能更喜欢int.TryParse。