Temukan dan ekstrak angka dari sebuah string


320

Saya memiliki persyaratan untuk menemukan dan mengekstrak angka yang terkandung dalam string.

Misalnya, dari string ini:

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

Bagaimana saya bisa melakukan ini?


2
Mungkinkah angkanya negatif? Jika demikian, bagaimana "Halo - apa kabar? -30" akan ditangani?
Jon Skeet

Hai John, Tidak ada angka negatif dalam data
van

4
Seperti angka desimal 1.5? Seperti notasi eksponensial 1.5E45?
Tim Pietzcker

Serupa (tetapi tidak identik): stackoverflow.com/questions/1561273/…
finnw

3
Mengapa tidak ada jawaban yang diterima di sini?
Wiktor Stribiżew

Jawaban:


63

pergi melalui string dan gunakan 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);

15
@ Thomas: Kode itu tidak berfungsi, hasilnya dengan b == "System.Linq.Enumerable..". Benar (dan bahkan lebih sederhana) adalahb = String.Join("", a.Where(char.IsDigit))
BlueRaja - Danny Pflughoeft

1
Poin bagus, itu akan mengajari saya untuk tidak menguji kode yang saya tulis dalam komentar! Anda juga bisa membuat string dari array char menggunakan new string(char[])konstruktor.
Thomas

1
Regex melakukan pekerjaan yang jauh lebih baik.
Jason Kelley

@BlueRaja - Danny Pflughoeft Mengapa tidak membuat komentar Anda sebagai jawaban yang tepat sehingga saya dapat memilihnya :-)
SteveC

CATATAN: Jika string berisi beberapa angka, jawaban ini akan menjalankan semuanya menjadi satu nomor. Misalnya "a12bcd345" menghasilkan "12345". (Yang mungkin diinginkan atau tidak, tergantung pada tujuannya.) Ini berbeda dari solusi Regex yang terpilih, yang akan mengembalikan "12" untuk kasus di atas. Ini penting untuk kasus-kasus seperti nomor telepon "555-111-2222".
ToolmakerSteve

546

\d+adalah regex untuk angka integer. Begitu

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

mengembalikan string yang berisi kemunculan pertama suatu angka di subjectString.

Int32.Parse(resultString) kemudian akan memberikan nomornya.


10
untuk mendukung angka negatif yang dapat Anda gunakan Regex.Match(subjectString, @"-?\d+").Valuesebagai gantinya
Jon List

45
Jawaban ini tidak lengkap (dalam C #). Itu hanya mendapatkan angka pertama dalam string. Anda harus mengulangi pertandingan: resultString = string.Join (string.Empty, Regex.Matches (subjectString, @ "\ d +"). OfType <Match> () .Pilih (m => m.Value));
Markus

8
@Markus: Negara-negara pertanyaan "Saya perlu untuk mengambil sebuah nomor yang terkandung dalam string", dan semua contoh menunjukkan nomor tunggal yang hadir dalam string. Mengulang-ulang satu item tidak berguna.
Tim Pietzcker

2
@ Jayman: Oh, koma itu ribuan pemisah? Itu akan membutuhkan regex yang jauh lebih kompleks - yang harus ditangani dalam pertanyaan terpisah. Titik awal yang sangat baik adalah Regular-Expressions.info yang juga berisi bagian pada mesin regex .NET.
Tim Pietzcker

5
@ Davidvidopko: Apa yang kamu bicarakan? Pertanyaan awal meminta cara untuk mengekstraksi nomor tunggal dari string, baik dalam judul maupun dalam tubuh pertanyaan. Pengeditan selanjutnya untuk pertanyaan (setahun setelah jawaban saya dan kemudian) oleh orang-orang selain penulis asli mengubah judul menjadi "angka". Jika ada, edit yang salah itu harus dibatalkan.
Tim Pietzcker

181

Inilah cara saya membersihkan nomor telepon untuk mendapatkan digit saja:

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

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

1
solusi yang sangat elegan .. Saya suka penggunaan linq
Leo Gurdian

1
Solusi bagus untuk bilangan bulat! Ketahuilah bahwa ini tidak akan berhasil jika Anda mencoba menguraikan angka desimal karena titik desimal bukanlah angka.
Elijah Lofgren

40

gunakan ekspresi reguler ...

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

33

Apa yang saya gunakan untuk mendapatkan Nomor Telepon tanpa tanda baca ...

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

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

// result: 7877636511

18

Regex. Plit dapat mengekstraksi angka dari string. Anda mendapatkan semua angka yang ditemukan dalam sebuah 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);
    }
}

Keluaran:

Nomor: 4 Nomor: 40 Nomor: 30 Nomor: 10


16

Ini sebuah Linqversi:

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

14
bagaimana dengan sederhana "123iuow45ss".AsEnumerable().Where(char.IsDigit)?
Ilya Ivanov

2
Aku hanya tidak suka from t .. select tredundansi, tapi bagaimanapun, bersorak.
Ilya Ivanov

14

Solusi sederhana lain menggunakan Regex Anda harus menggunakan ini

using System.Text.RegularExpressions;

dan kodenya

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

12

Anda juga dapat mencoba ini

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

bagus tetapi jika Anda memiliki spasi di antara angka-angka dalam string asli maka itu akan memberi Anda 1 string bersambung besar dengan kedua angka bergabung (tidak ada spasi)
Mohammad Zekrallah

11

Cukup gunakan RegEx untuk mencocokkan string, lalu konversi:

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

9

Berikut adalah Linqpendekatan lain yang mengekstrak angka pertama dari sebuah 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);

Contoh:

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

9

Bagi mereka yang menginginkan angka desimal dari string dengan Regex di baris DUA :

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

Hal yang sama berlaku untuk mengapung , panjang , dll ...


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

1
Ini adalah jawaban terbaik yang memberi saya apa yang saya inginkan, yaitu array dari beberapa angka dalam string. Kalau saja itu bisa mengabaikan koma dalam angka (seribu pemisah) maka itu akan sempurna! :-)
Sagar

9

Anda dapat melakukan ini menggunakan Stringproperti seperti di bawah ini:

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

yang hanya memberikan angka dari string.


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

7

Pertanyaannya tidak secara eksplisit menyatakan bahwa Anda hanya ingin karakter 0 hingga 9 tetapi tidak akan sulit untuk percaya bahwa itu benar dari set contoh Anda dan komentar. Jadi di sini adalah kode yang melakukan itu.

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

Mengapa Anda tidak ingin menggunakan Char.IsDigit () - Angka termasuk karakter seperti pecahan, subskrip, superskrip, angka Romawi, pembilang mata uang, angka yang dilingkari, dan angka khusus skrip.


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

Dapatkan semua angka dalam string. Jadi jika Anda menggunakan untuk contoh '1 plus 2' itu akan mendapatkan '12'.


5

Metode ekstensi untuk mendapatkan semua angka positif yang terkandung dalam string:

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

Jika Anda ingin angka negatif juga cukup modifikasi kode ini untuk menangani tanda minus ( -)

Diberikan masukan ini:

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

Daftar nomor yang dihasilkan adalah:

[1989, 27, 2016]

5

jika angka tersebut memiliki titik desimal, Anda dapat menggunakan di bawah ini

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

hasil:

"anything 876.8 anything" ==> 876.8

"anything 876 anything" ==> 876

"$ 876435" ==> 876435

"$ 876.435" ==> 876.435

Contoh: https://dotnetfiddle.net/IrtqVt


1
Terima kasih banyak atas jawaban ini. Saya menggunakan C # dan VS2017 dan berusaha mencari tahu bagaimana cara menemukan nilai. Sekali lagi terima kasih atas jawaban Anda.
Bubbles


2
  string verificationCode ="dmdsnjds5344gfgk65585";
            string code = "";
            Regex r1 = new Regex("\\d+");
          Match m1 = r1.Match(verificationCode);
           while (m1.Success)
            {
                code += m1.Value;
                m1 = m1.NextMatch();
            }

Kode ini digunakan untuk menemukan semua nilai integer dalam sebuah string.
Manoj Gupta

Akan lebih baik untuk menambahkan beberapa deskripsi langsung ke jawaban daripada mengirimnya secara terpisah sebagai komentar. Komentar tidak selalu langsung terlihat.
John Dvorak

2

Pendekatan yang menarik disediakan di sini oleh Ahmad Mageed, menggunakan Regex dan stringbuilder untuk mengekstrak bilangan bulat dalam urutan di mana mereka muncul dalam string.

Contoh menggunakan Regex.Split berdasarkan pos oleh Ahmad Mageed adalah sebagai berikut:

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

2

Ini Algoritma saya

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

1

ini solusinya

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

0

Anda harus menggunakan Regex sebagai \d+

\d cocok dengan digit dalam string yang diberikan.


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


-3

Berdasarkan sampel terakhir saya membuat metode:

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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.