it-swarm-tr.com

Bir dizgiden bir numara bul ve çıkart

Bir dize içinde bulunan bir sayı bulmak ve çıkarmak için bir gereksinim var.

Örneğin, bu dizgilerden:

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

Bunu nasıl yapabilirim?

248
van

\d+ bir tamsayı sayısının regex'idir. Yani 

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

subjectString içindeki bir sayının ilk oluşumunu içeren bir dize döndürür.

Int32.Parse(resultString) size numarayı verecektir.

466
Tim Pietzcker

Telefon numaralarını yalnızca rakamları almak için nasıl temizleyeceğim:

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

dize gidin ve Char.IsDigit kullanın

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

düzenli ifade kullan ...

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

Herhangi bir noktalama işareti olmadan Telefon Numaraları almak için ne kullanırım?.

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

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

// result: 7877636511
27
ejcortes

İşte Linq versiyonu:

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, dizgilerden sayıları alabilir. Bir dizede bulunan tüm sayıları alırsınız. 

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

Çıktı:

4 numara Sayı: 40 Sayı: 30 10 numara

15
Tabares

Bunu da deneyebilirsiniz

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

Regex.__ kullanarak başka bir basit çözüm. Bunu kullanmanız gerekir 

using System.Text.RegularExpressions;

ve kod

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

Sadece dizeyle eşleştirmek için bir RegEx kullanın, sonra dönüştürün:

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

İşte bir diziden ilk sayıyı çıkaran başka bir Linq yaklaşımı. 

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

Örnekler:

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

ondalık sayılarını bir dizgeden Regex inILEsatırı isteyenler için:

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

Aynı şey float , long , vb. İçin de geçerlidir.

7
Richard Fu

Soru açıkça sadece 0 - 9 arasındaki karakterleri istediğinizi belirtmiyor, ancak bunun örnek kümenizden ve yorumlarınızdan doğru olduğuna inanmanın bir yolu olmayacak. Yani burada bunu yapan kod var.

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

Neden kullanmak istemiyorsunuz Char.IsDigit () - Rakamlar, kesirler, abonelikler, üst simgeler, Romen rakamları, para birimi rakamları, çemberlenmiş rakamlar ve betiğe özgü rakamlar gibi karakterler içerir.

7
Atters

Bunu, aşağıdaki gibi String özelliğini kullanarak yapabilirsiniz:

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

dize sadece sayı verir.

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

Dizedeki tüm sayıları al. Eğer '1 artı 2' örneğini kullanırsanız, '12' alırsınız.

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
Ramireddy Ambati

Bir dizede bulunan tüm pozitif sayılarını almak için uzatma yöntemi:

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

Negatif sayıları da istiyorsanız, eksi işaretini işlemek için bu kodu değiştirmeniz yeterlidir (-)

Bu giriş verildiğinde:

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

Elde edilen numaralar listesi:

[1989, 27, 2016]

Bu soruya verilen cevaplardan birinin tersi mi oldu: Regex.Replace kullanarak dize sayıları nasıl kaldırılır?

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

işte çözümüm

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

Ahmad Mageed tarafından ilginç bir yaklaşım here tarafından sağlanmıştır, Regerx ve stringbuilder'ı kullanarak tamsayıları dizgede göründükleri sıraya göre ayıklamak için kullanır.

Ahmad Mageed'in gönderisine göre Regex.Split'i kullanan bir örnek şöyledir:

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

sayının ondalık işareti varsa, aşağıdan kullanabilirsiniz.

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

sonuçlar :

"bir şey 876.8 bir şey" ==> 876.8

"bir şey 876 bir şey" ==> 876

"$ 876435" ==> 876435

"$ 876.435" ==> 876.435

Örnek: 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"));
0

@ Tim-pietzcker yukarıdan cevap kullanarak, aşağıdakiler PowerShell için çalışacaktır.

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

İşte benim algoritmam

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

Regex'i \d+ olarak kullanmanız gerekecek.

\d, verilen dizedeki rakamlarla eşleşir.

0
Sachin Shanbhag