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

时间:2011-01-19 10:24:53

标签: c# .net regex string

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

例如,从这些字符串:

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

我该怎么做?

30 个答案:

答案 0 :(得分:484)

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

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

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

Int32.Parse(resultString)然后会给你这个号码。

答案 1 :(得分:132)

以下是我如何清理电话号码以获取数字:

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

答案 2 :(得分:51)

浏览字符串并使用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);

答案 3 :(得分:37)

使用正则表达式...

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!");
}

答案 4 :(得分:27)

我用什么来获取没有标点符号的电话号码......

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

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

// result: 7877636511

答案 5 :(得分:15)

这是Linq版本:

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

答案 6 :(得分:15)

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

答案 7 :(得分:12)

你也可以尝试这个

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

答案 8 :(得分:11)

使用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);

答案 9 :(得分:10)

只需使用RegEx匹配字符串,然后转换:

Match match = Regex.Match(test , @"(\d+)");
if (match.Success) {
   return int.Parse(match.Groups[1].Value);
}

答案 10 :(得分:8)

这是另一种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

答案 11 :(得分:8)

对于那些希望在 TWO 行中正则表达的字符串中的十进制数字的人:

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

同样适用于浮动等......

答案 12 :(得分: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() - 数字包括分数,下标,上标,罗马数字,货币分子,环绕数字和特定于脚本的数字等字符。

答案 13 :(得分:6)

{{1}}

答案 14 :(得分:6)

您可以使用String属性执行此操作,如下所示:

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

仅提供字符串中的数字。

答案 15 :(得分:6)

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

获取字符串中的所有数字。 因此,如果您使用examaple'1 plus 2',它将获得'12'。

答案 16 :(得分:6)

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

答案 17 :(得分: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]

答案 18 :(得分:3)

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

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

答案 19 :(得分:3)

这个问题的答案之一是否相反: How to remove numbers from string using Regex.Replace?

// Pull out only the numbers from the string using LINQ

var numbersFromString = new String(input.Where(x => x >= '0' && x <= '9').ToArray());

var numericVal = Int32.Parse(numbersFromString);

答案 20 :(得分:1)

我已经使用这个单行从任何字符串中提取所有数字。

var phoneNumber = "(555)123-4567";
var numsOnly = string.Join("", new Regex("[0-9]").Matches(phoneNumber)); // 5551234567

答案 21 :(得分:1)

Ahmad Mageed提供了一个有趣的方法here,使用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);

答案 22 :(得分: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();

答案 23 :(得分:1)

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

答案 24 :(得分: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"));

答案 25 :(得分:0)

这是我的算法

    //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;
    }

答案 26 :(得分:0)

使用@ tim-pietzcker answer from above,以下内容将适用于PowerShell

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

答案 27 :(得分: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;
    }

答案 28 :(得分:0)

您必须使用正则表达式\d+

\d匹配给定字符串中的数字。

答案 29 :(得分:-4)

根据最后一个样本,我创建了一个方法:

    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;
    }