Trouver et extraire un nombre d'une chaîne
j'ai une obligation de trouver et d'extraire un nombre contenu dans une chaîne.
par exemple, de ces cordes:
string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"
Comment faire?
26 réponses
\d+
est le regex pour un nombre entier. So
//System.Text.RegularExpressions.Regex
resultString = Regex.Match(subjectString, @"\d+").Value;
renvoie une chaîne contenant la première occurrence d'un nombre dans subjectString
.
Int32.Parse(resultString)
vous donnera alors le nombre.
Voici comment je nettoie les numéros de téléphone pour obtenir les chiffres seulement:
string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());
passez par la chaîne et utilisez 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);
utiliser l'expression régulière ...
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!");
}
ce que j'utilise pour obtenir des numéros de téléphone sans aucune ponctuation...
var phone = "(787) 763-6511";
string.Join("", phone.ToCharArray().Where(Char.IsDigit));
// result: 7877636511
Regex.Split peut extraire des nombres à partir de chaînes. Vous obtenez tous les nombres qui se trouvent dans une chaîne.
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);
}
}
sortie:
numéro: 4 Numéro: 40 Numéro: 30 Le numéro: 10
Voici une Linq
version:
string s = "123iuow45ss";
var getNumbers = (from t in s
where char.IsDigit(t)
select t).ToArray();
Console.WriteLine(new string(getNumbers));
vous pouvez également essayer ce
string.Join(null,System.Text.RegularExpressions.Regex.Split(expr, "[^\d]"));
utilisez simplement un RegEx pour faire correspondre la chaîne, puis convertissez:
Match match = Regex.Match(test , @"(\d+)");
if (match.Success) {
return int.Parse(match.Groups[1].Value);
}
une autre solution simple utilisant Regex Vous devez utiliser ce
using System.Text.RegularExpressions;
et le code est
string var = "Hello3453232wor705Ld";
string mystr = Regex.Replace(var, @"\d", "");
string mynumber = Regex.Replace(var, @"\D", "");
Console.WriteLine(mystr);
Console.WriteLine(mynumber);
la question ne dit pas explicitement que vous voulez juste les caractères 0 à 9 mais il ne serait pas exagéré de croire que c'est vrai à partir de vos exemples et commentaires. Donc voici le code qui fait ça.
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;
}
pourquoi vous ne voulez pas utiliser Char.IsDigit () - les nombres comprennent des caractères tels que des fractions, des indices, des superscripts, des chiffres romains, des numérateurs de devises, des nombres encerclés et des chiffres spécifiques à un script.
Pour ceux qui veulent décimal le nombre à partir d'une chaîne avec Regex dans DEUX ligne:
decimal result = 0;
decimal.TryParse(Regex.Match(s, @"\d+").Value, out result);
Même chose applys float , long , etc...
var match=Regex.Match(@"a99b",@"\d+");
if(match.Success)
{
int val;
if(int.TryParse(match.Value,out val))
{
//val is set
}
}
Voici une autre approche Linq
qui extrait le premier numéro d'une chaîne.
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);
exemples:
string input = "123 foo 456"; // 123
string input = "foo 456"; // 456
string input = "123 foo"; // 123
vous pouvez le faire en utilisant String
propriété comme ci-dessous:
return new String(input.Where(Char.IsDigit).ToArray());
qui ne donne que le nombre de la chaîne.
var outputString = String.Join("", inputString.Where(Char.IsDigit));
affiche tous les numéros dans la chaîne. Donc si vous l'utilisez pour examaple '1 + 2' get '12'.
méthode D'Extension pour obtenir tous les positifs nombres contenus dans une chaîne de caractères:
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;
}
si vous voulez des nombres négatifs aussi bien modifier simplement ce code pour manipuler le signe moins ( -
)
étant donné cette entrée:
"I was born in 1989, 27 years ago from now (2016)"
la liste des nombres résultante sera:
[1989, 27, 2016]
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();
a fait le revers d'une des réponses à cette question: Comment supprimer des nombres de la chaîne en utilisant Regex.Remplacer?
// 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();
}
voici ma solution
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();
une approche intéressante est fournie ici par Ahmad Mageed, utilise Regex et stringbuilder pour extraire les entiers dans l'ordre dans lequel ils apparaissent dans la chaîne.
exemple D'utilisation de Regex.Split basé sur le billet de Ahmad Mageed est le suivant:
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);
vous devrez utiliser Regex comme \d+
\d
correspond aux chiffres de la chaîne donnée.
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"));
basé sur le dernier échantillon j'ai créé une méthode:
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;
}