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

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

例如,从这些字符串:

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

我该怎么做呢?

740929 次浏览

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

使用正则表达式…

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

你也可以试试这个

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

你必须使用Regex作为\d+

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

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

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

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

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

Int32.Parse(resultString)会给你这个数字。

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

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

将这个问题的其中一个答案颠倒: 如何使用Regex.Replace从字符串中删除数字? < / p >

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

下面是一个Linq版本:

string s = "123iuow45ss";
var getNumbers = (from t in s
where char.IsDigit(t)
select t).ToArray();
Console.WriteLine(new string(getNumbers));
  string verificationCode ="dmdsnjds5344gfgk65585";
string code = "";
Regex r1 = new Regex("\\d+");
Match m1 = r1.Match(verificationCode);
while (m1.Success)
{
code += m1.Value;
m1 = m1.NextMatch();
}

以下是我如何清理电话号码,让它只有数字:

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

正则表达式。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);
}
}

输出:

< p >数量:4 数量:40 数量:30 数量:10 < / p >

这是我的解决方案

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();
另一个使用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);

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

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

我用什么来得到电话号码没有任何标点符号…

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


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


// result: 7877636511

这个问题并没有明确地说明您只是想要字符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()——数字包括分数、下标、上标、罗马数字、货币分子、围起来的数字和特定于脚本的数字。

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

获取字符串中的所有数字。 因此,如果你使用'1 + 2',它将得到'12'.

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

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

    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]

下面是另一个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

对于那些想要从两个行中包含正则表达式的字符串中获得小数数字的人:

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

同样的事情也适用于浮动等…

你可以像下面这样使用String属性来做到这一点:

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

它只给出字符串中的数字。

 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();

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

这是我的算法

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

使用@tim-pietzcker 上面的回答,下面的代码将适用于PowerShell

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

如果数字有小数点,可以使用下面的方法

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

我使用这个一行程序从任何字符串中提取所有数字。

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

使用StringBuilder比在循环中连接字符串的性能稍好一些。如果处理的是大字符串,它的性能要高得多。

    public static string getOnlyNumbers(string input)
{
StringBuilder stringBuilder = new StringBuilder(input.Length);
for (int i = 0; i < input.Length; i++)
if (input[i] >= '0' && input[i] <= '9')
stringBuilder.Append(input[i]);


return stringBuilder.ToString();
}

注意:上面的例子函数只适用于正数

下面是另一个使用Linq的简单解决方案,它只从字符串中提取数值。

var numbers = string.Concat(stringInput.Where(char.IsNumber));

例子:

var numbers = string.Concat("(787) 763-6511".Where(char.IsNumber));

为:“7877636511”;