扫描数字字符串

时间:2014-07-26 22:33:18

标签: c#

我有一个包含单词和数字的字符串。 如何找到最后一个数字(位数未知)并将其隔离? 直到现在我使用了Substring方法,但是文本中数字的位置以及数字的长度都是未知的。

谢谢!

6 个答案:

答案 0 :(得分:7)

这是使用regular expressions的简单解决方案:

var number = Regex.Match(input, @"(.*\D|^)(\d+)").Groups[2].Value;

或稍微不同的解决方案,一点点Linq投入了很好的措施:

var number = Regex.Matches(input, @"\d+").Cast<Match>().Last().Value;

这是一个使用普通旧for循环的解决方案;不需要Linq或正则表达式:

int start = 0, end = 0;
for (var i = input.Length - 1; i >= 0; i--) {
    if (char.IsDigit(input[i]))
    {
        end = i + 1;
        while (i >= 0 && char.IsDigit(input[i])) i--;
        start = i + 1;
        break;
    }
}
var number = input.Substring(start, end - start);

答案 1 :(得分:1)

您还可以使用更明确的方式:

var lastNumberIndex = yourString
        .LastIndexOfAny(new[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'});

答案 2 :(得分:1)

这应该这样做:

var res = Regex.Matches("kadlkfmg 57 dklfmgladg 89 dfdd", @"\d+");
var lastMatch = res.Cast<Match>().LastOrDefault();
if(lastMatch != null)
{
    var nr = lastMatch.Value;
}

答案 3 :(得分:1)

只需从结尾开始,然后搜索您可以找到的第一个整数值。在我看来,这是最有效的方法。

最后一位数字:

string s = "randomstringwithnumbers1234567890";
for (int i = s.Length() - 1; i >= 0; i--)
{
   if (int.tryParse(s[i], out n) //or use if (char.IsDigit(s[i]))
      return s[i];
}

最后一个号码:

string s = "randomstringwithnumbers1234567890";
string b = "";
for (int i = s.Length() - 1; i >= 0; i--) //or use if (char.IsDigit(s[i]))
{
   if (int.tryParse(s[i], out n)
      b =+ s[i];
   else if (b.Length() != 0)
      return b;
}

答案 4 :(得分:1)

这将获得字符串中的最后一位数字(两个示例):

string testing = "SomeTextWith3Various45Numbers345InIt";
var mychar = testing.Reverse().First(c => char.IsDigit(c));
var mychar2 = testing.Last(c => char.IsDigit(c));

编辑:

要获得最后一个数字(整数),我们会这样做:

var mychar3 = new string(testing.Reverse()
                                .SkipWhile(c => !char.IsDigit(c))
                                .TakeWhile(c => char.IsDigit(c))
                                .Reverse().ToArray());

答案 5 :(得分:1)

您还可以使用高效字符串方法和可读LINQ的组合:

string text = "Foo 1234 Test Bah344 ....";
int index = text.LastIndexOfAny("0123456789".ToCharArray());
if(index >= 0)
{
    string until = text.Substring(0, index + 1);
    var digits = until.Reverse().TakeWhile(char.IsDigit).Reverse();
    string lastNumber = new string(digits.ToArray());  // 344
}                 

这是一个不太有效的一半半班轮:

var lastDigits = text.Reverse()
    .SkipWhile(c => !char.IsDigit(c))
    .TakeWhile(char.IsDigit).Reverse();
string lastNumber = lastDigits.Any() ? new string(lastDigits.ToArray()) : "";