从字符串中查找并提取数字


319

我需要查找并提取字符串中包含的数字。

例如,从这些字符串中:

string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"

我怎样才能做到这一点?


2
这个数字可能是负数吗?如果是这样,将如何处理“你好-你好吗?-30”?
乔恩·斯基特

约翰,您好,数据中没有负数
van

4
十进制数字1.5?指数符号像1.5E45
蒂姆·皮茨克

类似(但不相同):stackoverflow.com/questions/1561273/...
finnw

3
为什么这里没有答案?
WiktorStribiżew17年

Answers:


63

通过字符串并使用 Char.IsDigit

string a = "str123";
string b = string.Empty;
int val;

for (int i=0; i< a.Length; i++)
{
    if (Char.IsDigit(a[i]))
        b += a[i];
}

if (b.Length>0)
    val = int.Parse(b);

15
@Thomas:该代码无效,结果为b == "System.Linq.Enumerable.."。正确(甚至更简单)的是b = String.Join("", a.Where(char.IsDigit))
BlueRaja-Danny Pflughoeft

1
好一点,那会教我不要测试我在注释中编写的代码!您还可以使用new string(char[])构造函数从char数组中创建一个字符串。
托马斯

1
正则表达式做得更好。
杰森·凯利2015年

@BlueRaja-Danny Pflughoeft为什么不对您的评论做一个正确的答复,以便我可以投票给他:-)
SteveC

注意:如果字符串包含多个数字,此答案将它们全部一起运行为一个数字。例如,“ a12bcd345”结果为“ 12345”。(取决于目标,这是否可取。)这与投票最多的Regex解决方案不同,后者在上述情况下将返回“ 12”。这对于电话号码“ 555-111-2222”的情况很重要。
ToolmakerSteve

546

\d+是整数的正则表达式。所以

//System.Text.RegularExpressions.Regex
resultString = Regex.Match(subjectString, @"\d+").Value;

返回一个字符串,该字符串包含中第一个出现的数字subjectString

Int32.Parse(resultString) 然后会给您号码。


10
以支持负数,您可以使用Regex.Match(subjectString, @"-?\d+").Value替代
乔恩名单

45
这个答案还不完整(在C#中)。它仅获得字符串中的第一个数字。您必须仔细看一下匹配项:resultString = string.Join(string.Empty,Regex.Matches(subjectString,@“ \ d +”)。OfType <Match>()。Select(m => m.Value));
马库斯

8
@Markus:问题指出“我需要提取字符串中包含数字”,所有示例均显示字符串中存在单个数字。遍历单个项目没有用。
Tim Pietzcker 2014年

2
@ayman:哦,逗号是数千个分隔符?这将需要更复杂的正则表达式-应该在单独的问题中处理。一个很好的起点是Regular-Expressions.info,它也包含.NET的正则表达式引擎的各个部分。
Tim Pietzcker 2014年

5
@DavidSopko:你在说什么?最初的问题要求在标题和问题正文中从字符串中提取单个数字的方法。除原始作者之外,其他人随后对问题的编辑(在我回答后的第一年和以后)将标题更改为“数字”。如果有的话,应该回滚该错误的编辑。
Tim Pietzcker 2015年

180

这是我清理电话号码以仅获取数字的方法:

string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());

31
string numericPhone =new String(phone.Where(Char.IsDigit).ToArray());
Damith 2014年

1
非常优雅的解决方案。我喜欢使用linq
Leo Gurdian

1
整数的不错解决方案!请注意,如果您尝试解析十进制数字,则此方法将无效,因为小数点不是数字。
伊莱贾·洛夫格伦

40

使用正则表达式...

Regex re = new Regex(@"\d+");
Match m = re.Match("test 66");

if (m.Success)
{
    Console.WriteLine(string.Format("RegEx found " + m.Value + " at position " + m.Index.ToString()));
}
else
{
    Console.WriteLine("You didn't enter a string containing a number!");
}

33

我用来获取电话号码而没有任何标点符号的东西...

var phone = "(787) 763-6511";

string.Join("", phone.ToCharArray().Where(Char.IsDigit));

// result: 7877636511

18

Regex.Split可以从字符串中提取数字。您将获得在字符串中找到的所有数字。

string input = "There are 4 numbers in this string: 40, 30, and 10.";
// Split on one or more non-digit characters.
string[] numbers = Regex.Split(input, @"\D+");
foreach (string value in numbers)
{
    if (!string.IsNullOrEmpty(value))
    {
    int i = int.Parse(value);
    Console.WriteLine("Number: {0}", i);
    }
}

输出:

人数:4人数:40人数:30人数:10


16

这是一个Linq版本:

string s = "123iuow45ss";
var getNumbers = (from t in s
                  where char.IsDigit(t)
                  select t).ToArray();
Console.WriteLine(new string(getNumbers));

14
那干嘛"123iuow45ss".AsEnumerable().Where(char.IsDigit)呢?
伊利亚·伊万诺夫

2
我只是不喜欢from t .. select t冗余,但无论如何,欢呼。
伊利亚·伊万诺夫

14

使用Regex的另一个简单解决方案您应该使用此

using System.Text.RegularExpressions;

和代码是

string var = "Hello3453232wor705Ld";
string mystr = Regex.Replace(var, @"\d", "");
string mynumber = Regex.Replace(var, @"\D", "");
Console.WriteLine(mystr);
Console.WriteLine(mynumber);

12

您也可以尝试

string.Join(null,System.Text.RegularExpressions.Regex.Split(expr, "[^\\d]"));

很好,但是如果原始字符串中的数字之间有空格,则它将为您提供一个大的串联字符串,并且两个数字都连接在一起(没有空格)
Mohammad Zekrallah


9

这是Linq从字符串中提取第一个数字的另一种方法。

string input = "123 foo 456";
int result = 0;
bool success = int.TryParse(new string(input
                     .SkipWhile(x => !char.IsDigit(x))
                     .TakeWhile(x => char.IsDigit(x))
                     .ToArray()), out result);

例子:

string input = "123 foo 456"; // 123
string input = "foo 456";     // 456
string input = "123 foo";     // 123

9

对于那些谁想要十进制从一个串号正则表达式行:

decimal result = 0;
decimal.TryParse(Regex.Match(s, @"\d+").Value, out result);

同样的情况适用于floatlong等。


9
 string input = "Hello 20, I am 30 and he is 40";
 var numbers = Regex.Matches(input, @"\d+").OfType<Match>().Select(m => int.Parse(m.Value)).ToArray();

1
这是给我我想要的最好的答案,它是字符串中多个数字的数组。如果只能忽略数字逗号(千位分隔符),那将是完美的!:-)
萨加尔(Sagar)

9

您可以使用String如下属性进行此操作:

 return new String(input.Where(Char.IsDigit).ToArray()); 

仅给出字符串中的数字。


7
var match=Regex.Match(@"a99b",@"\d+");
if(match.Success)
{
    int val;
    if(int.TryParse(match.Value,out val))
    {
        //val is set
    }
}

7

问题并没有明确指出您只想要0到9个字符,但是相信您的示例集和注释中的内容是正确的也就不算什么了。因此,这是执行此操作的代码。

        string digitsOnly = String.Empty;
        foreach (char c in s)
        {
            // Do not use IsDigit as it will include more than the characters 0 through to 9
            if (c >= '0' && c <= '9') digitsOnly += c;
        }

为什么不想使用Char.IsDigit()-数字包括小数,下标,上标,罗马数字,货币分子,带圆圈的数字和特定于脚本的数字之类的字符。


6
var outputString = String.Join("", inputString.Where(Char.IsDigit));

获取字符串中的所有数字。因此,如果您使用“ 1加2”作为示例,它将得到“ 12”。


5

扩展方法来获取字符串中包含的所有数:

    public static List<long> Numbers(this string str)
    {
        var nums = new List<long>();
        var start = -1;
        for (int i = 0; i < str.Length; i++)
        {
            if (start < 0 && Char.IsDigit(str[i]))
            {
                start = i;
            }
            else if (start >= 0 && !Char.IsDigit(str[i]))
            {
                nums.Add(long.Parse(str.Substring(start, i - start)));
                start = -1;
            }
        }
        if (start >= 0)
            nums.Add(long.Parse(str.Substring(start, str.Length - start)));
        return nums;
    }

如果还需要负数,只需修改此代码即可处理减号(-

鉴于此输入:

"I was born in 1989, 27 years ago from now (2016)"

结果数字列表将为:

[1989, 27, 2016]

5

如果数字有小数点,您可以在下面使用

using System;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //Your code goes here
            Console.WriteLine(Regex.Match("anything 876.8 anything", @"\d+\.*\d*").Value);
            Console.WriteLine(Regex.Match("anything 876 anything", @"\d+\.*\d*").Value);
            Console.WriteLine(Regex.Match("$876435", @"\d+\.*\d*").Value);
            Console.WriteLine(Regex.Match("$876.435", @"\d+\.*\d*").Value);
        }
    }
}

结果:

“任何876.8任何东西” ==> 876.8

“任何876都有什么” ==> 876

“ $ 876435” ==> 876435

“ $ 876.435” ==> 876.435

范例:https : //dotnetfiddle.net/IrtqVt


1
非常感谢您的回答。我正在使用C#和VS2017,并试图找出如何找到该值。再次感谢您的回答。
泡泡


2
  string verificationCode ="dmdsnjds5344gfgk65585";
            string code = "";
            Regex r1 = new Regex("\\d+");
          Match m1 = r1.Match(verificationCode);
           while (m1.Success)
            {
                code += m1.Value;
                m1 = m1.NextMatch();
            }

此代码用于查找字符串中的所有整数值。
Manoj Gupta 2013年

将一些描述直接添加到答案中比将其单独发布为评论要好。评论并非总是立即可见。
John Dvorak

2

Ahmad Mageed 在这里提供一种有趣的方法,它使用Regex和stringbuilder来提取整数(按它们在字符串中出现的顺序)。

基于Ahmad Mageed的帖子使用Regex.Split的示例如下:

var dateText = "MARCH-14-Tue";
string splitPattern = @"[^\d]";
string[] result = Regex.Split(dateText, splitPattern);
var finalresult = string.Join("", result.Where(e => !String.IsNullOrEmpty(e)));
int DayDateInt = 0;

int.TryParse(finalresult, out DayDateInt);

2

这是我的算法

    //Fast, C Language friendly
    public static int GetNumber(string Text)
    {
        int val = 0;
        for(int i = 0; i < Text.Length; i++)
        {
            char c = Text[i];
            if (c >= '0' && c <= '9')
            {
                val *= 10;
                //(ASCII code reference)
                val += c - 48;
            }
        }
        return val;
    }

1

这是我的解决方案

string var = "Hello345wor705Ld";
string alpha = string.Empty;
string numer = string.Empty;
foreach (char str in var)
{
    if (char.IsDigit(str))
        numer += str.ToString();
    else
        alpha += str.ToString();
}
Console.WriteLine("String is: " + alpha);
Console.WriteLine("Numeric character is: " + numer);
Console.Read();


0
static string GetdigitFromString(string str)
    {
        char[] refArray = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        char[] inputArray = str.ToCharArray();
        string ext = string.Empty;
        foreach (char item in inputArray)
        {
            if (refArray.Contains(item))
            {
                ext += item.ToString();
            }
        }
        return ext;
    }

0
string s = "kg g L000145.50\r\n";
        char theCharacter = '.';
        var getNumbers = (from t in s
                          where char.IsDigit(t) || t.Equals(theCharacter)
                          select t).ToArray();
        var _str = string.Empty;
        foreach (var item in getNumbers)
        {
            _str += item.ToString();
        }
        double _dou = Convert.ToDouble(_str);
        MessageBox.Show(_dou.ToString("#,##0.00"));

0

使用上面的@ tim-pietzcker 答案,以下将适用于PowerShell

PS C:\> $str = '1 test'
PS C:\> [regex]::match($str,'\d+').value
1

-3

基于上一个示例,我创建了一个方法:

private string GetNumberFromString(string sLongString, int iLimitNumbers)
{
    string sReturn = "NA";
    int iNumbersCounter = 0;
    int iCharCounter = 0; 

    string sAlphaChars = string.Empty;
    string sNumbers = string.Empty;
    foreach (char str in sLongString)
    {
        if (char.IsDigit(str))
        {
            sNumbers += str.ToString();
            iNumbersCounter++;
            if (iNumbersCounter == iLimitNumbers)
            {
                return sReturn = sNumbers;
            }
        }
        else
        {
            sAlphaChars += str.ToString();
            iCharCounter++;
            // reset the counter 
            iNumbersCounter = 0; 
        }
    }
    return sReturn;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.