it-swarm.com.de

Suchen und extrahieren Sie eine Zahl aus einer Zeichenfolge

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?

248
van

\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.

466
Tim Pietzcker

So säubere ich Telefonnummern, um nur die Ziffern zu erhalten:

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

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);
50
Sasha Reminnyi

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

Was ich brauche, um Telefonnummern ohne Interpunktion zu erhalten ...

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

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

// result: 7877636511
27
ejcortes

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

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

15
Tabares

Sie können dies auch versuchen

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

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

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);
}
10
Daniel Gehriger

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
7
fubo

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 ...

7
Richard Fu

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.

7
Atters

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.

6
var match=Regex.Match(@"a99b",@"\d+");
if(match.Success)
{
    int val;
    if(int.TryParse(match.Value,out val))
    {
        //val is set
    }
}
6
spender
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.

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

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

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

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);
1
Simba
  string verificationCode ="dmdsnjds5344gfgk65585";
            string code = "";
            Regex r1 = new Regex("\\d+");
          Match m1 = r1.Match(verificationCode);
           while (m1.Success)
            {
                code += m1.Value;
                m1 = m1.NextMatch();
            }
1
Manoj Gupta

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

0
Tarek El-Mallah
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
0
user2320464
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;
    }
0
Ruby Beginner

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

Sie müssen Regex als \d+ verwenden.

\d stimmt mit den Ziffern in der angegebenen Zeichenfolge überein.

0
Sachin Shanbhag