Tìm và trích xuất một số từ một chuỗi


320

Tôi có một yêu cầu để tìm và trích xuất một số có trong một chuỗi.

Ví dụ: từ các chuỗi này:

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

Tôi có thể làm cái này như thế nào?


2
Con số có thể là số âm? Nếu vậy, "Xin chào - bạn thế nào? -30" sẽ được xử lý như thế nào?
Jon Skeet

Xin chào John, Không có số âm trong dữ liệu
van

4
Số thập phân như thế 1.5nào? Ký hiệu số mũ như thế 1.5E45nào?
Tim Pietzcker

Tương tự (nhưng không giống nhau): stackoverflow.com/questions/1561273/ từ
finnw

3
Tại sao không có câu trả lời được chấp nhận ở đây?
Wiktor Stribiżew

Câu trả lời:


63

đi qua chuỗi và sử dụng 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: Mã đó không hoạt động, kết quả là b == "System.Linq.Enumerable.." . Đúng (và thậm chí đơn giản hơn) sẽ làb = String.Join("", a.Where(char.IsDigit))
BlueRaja - Danny Pflughoeft

1
Điểm hay, điều đó sẽ dạy tôi không kiểm tra mã tôi viết trong bình luận! Bạn cũng có thể tạo một chuỗi từ một mảng char bằng cách sử dụng hàm new string(char[])tạo.
Thomas

1
Regex làm một công việc tốt hơn nhiều.
Jason Kelley

@BlueRaja - Daniel Pflughoeft Tại sao không bình luận của bạn một câu trả lời thích hợp để tôi có thể bỏ phiếu :-)
SteveC

LƯU Ý: Nếu chuỗi chứa nhiều số, câu trả lời này sẽ chạy tất cả chúng thành một số duy nhất. Ví dụ: "a12bcd345" cho kết quả là "12345". (Điều này có thể được mong muốn hay không, tùy thuộc vào mục tiêu.) Điều này khác với giải pháp Regex được bình chọn hàng đầu, sẽ trả về "12" cho trường hợp trên. Điều này quan trọng đối với các trường hợp như số điện thoại "555-111-2222".
ToolmakerSteve

546

\d+là regex cho một số nguyên. Vì thế

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

trả về một chuỗi chứa sự xuất hiện đầu tiên của một số trong subjectString.

Int32.Parse(resultString) sau đó sẽ cung cấp cho bạn số.


10
để hỗ trợ số âm bạn có thể sử dụng Regex.Match(subjectString, @"-?\d+").Valuethay thế
Danh sách Jon

45
Câu trả lời này không đầy đủ (trong C #). Nó chỉ nhận được số đầu tiên trong chuỗi. Bạn phải sắp xếp lại các trận đấu: resultString = string.Join (string.Empty, Regex.Matches (topicString, @ "\ d +"). OfType <Match> (). Chọn (m => m.Value));
Markus

8
@Markus: Câu hỏi nêu rõ "Tôi cần trích xuất một số có trong một chuỗi" và tất cả các ví dụ cho thấy một số duy nhất hiện diện trong chuỗi. Lặp lại một mục duy nhất là không hữu ích.
Tim Pietzcker

2
@ayman: Ồ, dấu phẩy là hàng ngàn dấu phân cách? Điều đó sẽ đòi hỏi một regex phức tạp hơn nhiều - cần được xử lý trong một câu hỏi riêng biệt. Một điểm khởi đầu tuyệt vời là Chính quy-Expressions.info cũng chứa các phần trên công cụ regex của .NET.
Tim Pietzcker

5
@DavidSopko: Bạn đang nói về cái gì vậy? Câu hỏi ban đầu yêu cầu một cách để trích xuất một số duy nhất từ ​​một chuỗi, cả trong tiêu đề và trong thân câu hỏi. Những chỉnh sửa tiếp theo cho câu hỏi (một năm sau câu trả lời của tôi và sau đó) bởi những người không phải là tác giả ban đầu đã thay đổi tiêu đề thành "số". Nếu bất cứ điều gì, chỉnh sửa bị lỗi đó nên được khôi phục.
Tim Pietzcker

181

Đây là cách tôi xóa số điện thoại để chỉ lấy các chữ số:

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

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

1
giải pháp rất thanh lịch .. Tôi thích việc sử dụng linq
Leo Gurdian

1
Giải pháp tốt đẹp cho số nguyên! Xin lưu ý rằng điều này sẽ không hoạt động nếu bạn đang cố phân tích một số thập phân vì dấu thập phân không phải là một chữ số.
Elijah Lofgren

40

sử dụng biểu thức chính quy ...

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

Những gì tôi sử dụng để nhận Số điện thoại mà không có dấu chấm câu ...

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

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

// result: 7877636511

18

Regex.Split có thể trích xuất số từ chuỗi. Bạn nhận được tất cả các số được tìm thấy trong một chuỗi.

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

Đầu ra:

Số: 4 Số: 40 Số: 30 Số: 10


16

Đây là một Linqphiên bản:

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

14
những gì đơn giản "123iuow45ss".AsEnumerable().Where(char.IsDigit)?
Ilya Ivanov

2
Tôi chỉ không thích from t .. select tsự dư thừa, nhưng dù sao, chúc mừng.
Ilya Ivanov

14

Một giải pháp đơn giản khác sử dụng Regex Bạn cần sử dụng cái này

using System.Text.RegularExpressions;

và mã là

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

12

Bạn cũng có thể thử điều này

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

đẹp nhưng nếu bạn có khoảng trắng giữa các số trong chuỗi gốc thì nó sẽ cung cấp cho bạn 1 chuỗi nối lớn với cả hai số được nối (không có khoảng
trắng

11

Chỉ cần sử dụng RegEx để khớp chuỗi, sau đó chuyển đổi:

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

9

Đây là một Linqcách tiếp cận khác để trích xuất số đầu tiên trong chuỗi.

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

Ví dụ:

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

9

Đối với những người muốn số thập phân từ một chuỗi có Regex trong dòng TWO :

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

Điều tương tự áp dụng cho nổi , dài , vv ...


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
Đây là câu trả lời tốt nhất cho tôi những gì tôi muốn, đó là mảng nhiều số trong chuỗi. Nếu chỉ có nó có thể bỏ qua dấu phẩy về số (dấu phân cách nghìn) thì đó sẽ là hoàn hảo! :-)
Sagar

9

Bạn có thể làm điều này bằng cách sử dụng Stringtài sản như dưới đây:

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

chỉ cung cấp số từ chuỗi.


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

7

Câu hỏi không nói rõ rằng bạn chỉ muốn các ký tự từ 0 đến 9 nhưng sẽ không thể tin được điều đó là đúng từ tập hợp ví dụ và nhận xét của bạn. Vì vậy, đây là mã mà làm điều đó.

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

Tại sao bạn không muốn sử dụng Char.IsDigit () - Các số bao gồm các ký tự như phân số, bảng con, siêu ký tự, chữ số La Mã, tử số tiền tệ, số được bao quanh và chữ số cụ thể của tập lệnh.


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

Lấy tất cả các số trong chuỗi. Vì vậy, nếu bạn sử dụng cho đề thi '1 cộng 2', nó sẽ nhận được '12'.


5

Phương pháp mở rộng để lấy tất cả các số dương có trong một chuỗi:

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

Nếu bạn muốn số âm cũng chỉ cần sửa đổi mã này để xử lý dấu trừ (- )

Cho đầu vào này:

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

Danh sách số kết quả sẽ là:

[1989, 27, 2016]

5

nếu số có dấu thập phân, bạn có thể sử dụng bên dưới

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

các kết quả :

"bất cứ điều gì 876.8 bất cứ điều gì" ==> 876.8

"bất cứ điều gì 876 bất cứ điều gì" ==> 876

"$ 876435" ==> 876435

"$ 876.435" ==> 876.435

Mẫu: https://dotnetfiddle.net/IrtqVt


1
Cảm ơn bạn rất nhiều vì câu trả lời này. Tôi đang sử dụng C # và VS2017 và đã cố gắng tìm hiểu làm thế nào để tôi tìm thấy giá trị. Cảm ơn bạn một lần nữa cho câu trả lời của bạn.
Bong bóng


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

Mã này được sử dụng để tìm tất cả giá trị nguyên trong một chuỗi.
Manoj Gupta

Sẽ tốt hơn nếu thêm một số mô tả trực tiếp vào câu trả lời hơn là đăng riêng nó như một bình luận. Bình luận không phải lúc nào cũng có thể nhìn thấy ngay lập tức.
John Dvorak

2

Một cách tiếp cận thú vị được cung cấp ở đây bởi Ahmad Mageed, sử dụng Regex và nhà xây dựng chuỗi để trích xuất các số nguyên theo thứ tự xuất hiện trong chuỗi.

Một ví dụ sử dụng Regex.Split dựa trên bài đăng của Ahmad Mageed như sau:

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

Đây là thuật toán của tôi

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

đây là giải pháp của tôi

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

Bạn sẽ phải sử dụng Regex như \d+

\d khớp các chữ số trong chuỗi đã cho.


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

Dựa trên mẫu cuối cùng tôi đã tạo ra một phương thức:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.