从字符串中获取前面的数字

27
如何从字符串中获取第一个数字?
示例:我有“1567438absdg345”
我只想获取“1567438”,不包括“absdg345”,我希望它是动态的,获取字母索引的第一次出现并删除其后的所有内容。

你尝试过自己做吗? - Meryovi
10个回答

48
你可以使用 TakeWhile 扩展方法从字符串中获取数字字符:
string input = "1567438absdg345";

string digits = new String(input.TakeWhile(Char.IsDigit).ToArray());

3
根据问题的描述,我所了解的期望结果是一个空字符串,而这也是函数返回的结果。 - Guffa
我不确定为什么这个被投票得这么高,因为它并没有做到被要求的事情。当输入以数字开头时,它只会给你第一个数字。当它以其他任何字符开头时,你会得到一个空结果。 - E. Hekkert
@E.Hekkert:这个问题在八年前就已经讨论过了。我理解这个问题的期望结果是如果字符串开头没有数字,则返回一个空字符串,这也是几乎所有回答这个问题的人所做出的确切解释。答案还清楚地说明了它的作用,因此如果您恰好对问题有不同的解释,就不会产生混淆。 - Guffa
1
@E.Hekkert:如果你想跳到第一个数字,你可以使用这个:string digits = new String(input.SkipWhile(c => !Char.IsDigit(c)).TakeWhile(Char.IsDigit).ToArray()); - Guffa

25

LINQ方法:

string input = "1567438absdg345";
string output = new string(input.TakeWhile(char.IsDigit).ToArray());

3
我删掉了我的答案,支持这一个。太好了! - James Hill

14

或者使用正则表达式方法

String s = "1567438absdg345";
String result = Regex.Match(s, @"^\d+").ToString();

^匹配字符串的开头,\d+匹配后面的数字。


7
你可以通过循环字符串并使用 Char.isDigit 测试当前字符是否为数字。
string str = "1567438absdg345";
string result = "";

for (int i = 0; i < str.Length; i++) // loop over the complete input
{
    if (Char.IsDigit(str[i])) //check if the current char is digit
        result += str[i];
    else
        break; //Stop the loop after the first character
}

4
忘记正则表达式,将其创建为一个助手函数,并将其放在某个地方...
string input = "1567438absdg345";
string result = "";

foreach(char c in input)
{
   if(!Char.IsDigit(c))
   {
      break;
   }
   result += c;
}

2
另一种方法
private int GetFirstNum(string inp)
{
    string final = "0"; //if there's nothing, it'll return 0
    foreach (char c in inp) //loop the string
    {
        try
        {
            Convert.ToInt32(c.ToString()); //if it can convert
            final += c.ToString(); //add to final string
        }
        catch (FormatException) //if NaN
        {
            break; //break out of loop
        }
    }

    return Convert.ToInt32(final); //return the int
}

测试:

    Response.Write(GetFirstNum("1567438absdg345") + "<br/>");
    Response.Write(GetFirstNum("a1567438absdg345") + "<br/>");

结果:

1567438
0


1

一种老派的正则表达式方式:

public long ParseInt(string str)
{
    long val = 0;
    System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(@"^([\d]+).*$");
    System.Text.RegularExpressions.Match match = reg.Match(str);
    if (match != null) long.TryParse(match.Groups[1].Value, out val);
    return val;
}

如果无法解析,则该方法返回0。

1
请尝试这个。
string val = "1567438absdg345";

System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("[1-9][0-9]*");

string valNum = reg.Match(val).Value;

1
这样你就可以从字符串中获取第一个数字。
string stringResult = "";
bool digitFound = false;
foreach (var res in stringToTest)
{
    if (digitFound && !Char.IsDigit(res))
        break;
    if (Char.IsDigit(res))
    {
        stringResult += res;
        digitFound = true;
    }
}

int? firstDigitInString = digitFound ? Convert.ToInt32(stringResult) : (int?)null;

另一种可能的选择:
string[] numbers = Regex.Split(input, @"\D+");

尽管如上数字列表中没有空字符串,但我不知道为什么结果是空字符串?
像下面这样解决了它,但似乎正则表达式应该改进以立即完成。
string[] numbers = Regex.Split(firstResult, @"\D+").Where(x => x != "").ToArray();

0

我知道这个问题已经有10年了,但以防其他人遇到它。如果数字恰好在输入字符串的开头,接受的答案只会给出第一个数字。

当您的字符串以除数字以外的任何内容开头时,它会返回空字符串。 在使用接受的答案之前,您需要先知道第一个数字的索引并执行一个子字符串。

string input = "abc123def456ghi";
string digits = null;
if (!string.IsNullOrEmpty(input))
{
    var indexFirstDigit = input.IndexOfAny("0123456789".ToCharArray());
    if (indexFirstDigit >= 0)
    {
        digits = new String(input.Substring(indexFirstDigit).TakeWhile(Char.IsDigit).ToArray());
    }
}

尽管使用正则表达式可以减少代码行数

string input = "abc012def345ghi";

System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("[\\d]+");

string digits = reg.Match(input).Value;

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