Encontre e extraia um número de uma string

Eu tenho um requisito para encontrar e extrair um número contido em uma string.

Por exemplo, dessas sequências:

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

Como posso fazer isso?

\d+ é o regex para um número inteiro. assim

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

retorna uma string contendo a primeira ocorrência de um número em subjectString .

Int32.Parse(resultString) fornecerá o número.

Aqui está como eu limpo números de telefone para obter apenas os dígitos:

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

atravesse a string e use 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); 

use expressão regular …

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

O que eu uso para obter números de telefone sem pontuação …

 var phone = "(787) 763-6511"; string.Join("", phone.ToCharArray().Where(Char.IsDigit)); // result: 7877636511 

Regex.Split pode extrair números de seqüências de caracteres. Você obtém todos os números encontrados em uma string.

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

Saída:

Número: 4 Número: 40 Número: 30 Número: 10

Aqui está uma versão do Linq :

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

Você também pode tentar isso

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

Basta usar um RegEx para corresponder à string e, em seguida, converter:

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

Outra solução simples usando Regex Você deve usar este

 using System.Text.RegularExpressions; 

e o código é

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

A questão não declara explicitamente que você quer apenas os caracteres de 0 a 9, mas não seria difícil acreditar que isso seja verdade no conjunto de exemplos e nos comentários. Então aqui está o código que faz isso.

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

Por que você não deseja usar Char.IsDigit () - Os números incluem caracteres como frações, subscritos, sobrescritos, algarismos romanos, numeradores de moeda, números circunscritos e dígitos específicos do script.

Para aqueles que querem números decimais de uma string com Regex em TWO line:

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

A mesma coisa aplica-se a flutuar , por muito tempo , etc …

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

Aqui está outra abordagem Linq que extrai o primeiro número de uma string.

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

Exemplos:

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

Você pode fazer isso usando a propriedade String como abaixo:

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

que dá apenas o número da string.

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

Obter todos os números na string. Então, se você usar para examaple ‘1 mais 2′, ele terá ’12’.

Método de extensão para obter todos os números positivos contidos em uma string:

  public static List Numbers(this string str) { var nums = new List(); 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; } 

Se você quiser números negativos, simplesmente modifique este código para manipular o sinal de menos ( - )

Dada essa input:

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

A lista de números resultante será:

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

Será que o reverso de uma das respostas para esta pergunta: Como remover números de string usando 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); 
  string verificationCode ="dmdsnjds5344gfgk65585"; string code = ""; Regex r1 = new Regex("\\d+"); Match m1 = r1.Match(verificationCode); while (m1.Success) { code += m1.Value; m1 = m1.NextMatch(); } 

aqui está a minha solução

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

Uma abordagem interessante é fornecida aqui por Ahmad Mageed, usa o Regex e o construtor de string para extrair os inteiros na ordem em que aparecem na string.

Um exemplo usando Regex.Split baseado no post de Ahmad Mageed é o seguinte:

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

Você terá que usar o Regex como \d+

\d corresponde a dígitos na string dada.

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

Com base no último exemplo, criei um método:

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