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?

mobil van
sumber
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);
Sasha Reminnyi
sumber
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.

Tim Pietzcker
sumber
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());
Dave
sumber
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!");
}
Pranay Rana
sumber
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
ejcortes
sumber
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

Tabares
sumber
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));
spajce
sumber
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);

sumber
12

Anda juga dapat mencoba ini

string.Join(null,System.Text.RegularExpressions.Regex.Split(expr, "[^\\d]"));
BvdVen
sumber
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);
}
Daniel Gehriger
sumber
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
fubo
sumber
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 ...

Richard Fu
sumber
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();
Ramireddy Ambati
sumber
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.

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

Atters
sumber
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'.

Tom
sumber
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]
Thomas CG de Vilhena
sumber
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

Tarek El-Mallah
sumber
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
3

Apakah kebalikan dari salah satu jawaban untuk pertanyaan ini: Bagaimana menghapus angka dari string menggunakan Regex.Replace?

// 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);
mwilly
sumber
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();
            }
Manoj Gupta
sumber
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);
Simba
sumber
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;
    }
HS_Kernel
sumber
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();

sumber
0

Anda harus menggunakan Regex sebagai \d+

\d cocok dengan digit dalam string yang diberikan.

Sachin Shanbhag
sumber
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;
    }
Ruby Beginner
sumber
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"));
watcharachai unvijit
sumber
0

Menggunakan jawaban @ tim-pietzcker dari atas , yang berikut ini akan berhasil PowerShell.

PS C:\> $str = '1 test'
PS C:\> [regex]::match($str,'\d+').value
1
pengguna2320464
sumber
-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;
}
MrJTNY
sumber