Ich muss eine in einem String enthaltene Zahl finden und extrahieren.
Zum Beispiel aus diesen Zeichenketten:
string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"
Wie kann ich das machen?
\d+
ist der Regex für eine ganze Zahl. So
//System.Text.RegularExpressions.Regex
resultString = Regex.Match(subjectString, @"\d+").Value;
gibt eine Zeichenfolge zurück, die das erste Vorkommen einer Zahl in subjectString
enthält.
Int32.Parse(resultString)
gibt Ihnen dann die Nummer.
So säubere ich Telefonnummern, um nur die Ziffern zu erhalten:
string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());
gehen Sie die Zeichenfolge durch und verwenden Sie 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);
regulären Ausdruck verwenden ...
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!");
}
Was ich brauche, um Telefonnummern ohne Interpunktion zu erhalten ...
var phone = "(787) 763-6511";
string.Join("", phone.ToCharArray().Where(Char.IsDigit));
// result: 7877636511
Hier ist eine Linq
Version:
string s = "123iuow45ss";
var getNumbers = (from t in s
where char.IsDigit(t)
select t).ToArray();
Console.WriteLine(new string(getNumbers));
Regex.Split kann Zahlen aus Strings extrahieren. Sie erhalten alle Zahlen, die in einer Zeichenfolge gefunden werden.
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);
}
}
Ausgabe:
Nummer 4 Anzahl: 40 Nummer: 30 Nummer 10
Sie können dies auch versuchen
string.Join(null,System.Text.RegularExpressions.Regex.Split(expr, "[^\\d]"));
Eine weitere einfache Lösung mit RegexSie sollten diese verwenden
using System.Text.RegularExpressions;
und der Code lautet
string var = "Hello3453232wor705Ld";
string mystr = Regex.Replace(var, @"\d", "");
string mynumber = Regex.Replace(var, @"\D", "");
Console.WriteLine(mystr);
Console.WriteLine(mynumber);
Verwenden Sie einfach einen RegEx, um die Zeichenfolge abzugleichen, und konvertieren Sie dann:
Match match = Regex.Match(test , @"(\d+)");
if (match.Success) {
return int.Parse(match.Groups[1].Value);
}
Hier ist ein weiterer Linq
-Ansatz, der die erste Zahl aus einem String extrahiert.
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);
Beispiele:
string input = "123 foo 456"; // 123
string input = "foo 456"; // 456
string input = "123 foo"; // 123
Für diejenigen, die decimal number aus einem String mit Regex inTWOline haben wollen
decimal result = 0;
decimal.TryParse(Regex.Match(s, @"\d+").Value, out result);
Dasselbe gilt für float , long , etc ...
Die Frage gibt nicht explizit an, dass Sie nur die Zeichen 0 bis 9 wollen, aber es wäre kein Anlass, zu glauben, dass Ihre Beispielssätze und Kommentare richtig sind. Also hier ist der Code, der das tut.
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;
}
Warum Sie nicht Char.IsDigit () verwenden möchten - Zahlen enthalten Zeichen wie Brüche, Subskriptionen, Superskripte, römische Ziffern, Währungskennziffern, umgebene Zahlen und skriptspezifische Ziffern.
Sie können dies mit der String
-Eigenschaft wie folgt tun:
return new String(input.Where(Char.IsDigit).ToArray());
was gibt nur die Nummer von String.
var match=Regex.Match(@"a99b",@"\d+");
if(match.Success)
{
int val;
if(int.TryParse(match.Value,out val))
{
//val is set
}
}
var outputString = String.Join("", inputString.Where(Char.IsDigit));
Holen Sie sich alle Zahlen in der Zeichenfolge. Wenn Sie also '1 plus 2' verwenden, wird '12' angezeigt.
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();
Erweiterungsmethode, um alle positiven Zahlen in einem String zu erhalten:
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;
}
Wenn Sie auch negative Zahlen wünschen, ändern Sie einfach diesen Code, um das Minuszeichen (-
) zu behandeln.
Bei dieser Eingabe:
"I was born in 1989, 27 years ago from now (2016)"
Die resultierende Nummernliste wird sein:
[1989, 27, 2016]
Ist die Umkehrung einer der Antworten auf diese Frage: Wie kann man mit Regex.Replace Zahlen aus Zeichenfolgen entfernen?
// 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);
hier ist meine Lösung
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();
Ein interessanter Ansatz ist here von Ahmad Mageed. Es verwendet Regex und Stringbuilder, um die Ganzzahlen in der Reihenfolge zu extrahieren, in der sie in der Zeichenfolge erscheinen.
Ein Beispiel für die Verwendung von Regex.Split basierend auf dem Beitrag von Ahmad Mageed lautet wie folgt:
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);
string verificationCode ="dmdsnjds5344gfgk65585";
string code = "";
Regex r1 = new Regex("\\d+");
Match m1 = r1.Match(verificationCode);
while (m1.Success)
{
code += m1.Value;
m1 = m1.NextMatch();
}
wenn die Zahl Dezimalstellen hat, können Sie diese unten verwenden
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);
}
}
}
ergebnisse :
"irgendetwas 876.8 irgendetwas" ==> 876.8
"irgendetwas 876 irgendetwas" ==> 876
"$ 876435" ==> 876435
"$ 876.435" ==> 876.435
Beispiel: https://dotnetfiddle.net/IrtqVt
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"));
Mit @ tim-pietzcker answer von oben funktioniert das Folgende für PowerShell
.
PS C:\> $str = '1 test'
PS C:\> [regex]::match($str,'\d+').value
1
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;
}
Hier ist mein Algorithmus
//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;
}
Sie müssen Regex als \d+
verwenden.
\d
stimmt mit den Ziffern in der angegebenen Zeichenfolge überein.