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?
1.5nào? Ký hiệu số mũ như thế 1.5E45nào?
                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?
1.5nào? Ký hiệu số mũ như thế 1.5E45nào?
                Câu trả lời:
đ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);
              b == "System.Linq.Enumerable.." . Đúng (và thậm chí đơn giản hơn) sẽ làb = String.Join("", a.Where(char.IsDigit))
                    new string(char[])tạo.
                    \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ố.
Regex.Match(subjectString, @"-?\d+").Valuethay thế
                    Đâ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());
              string numericPhone =new String(phone.Where(Char.IsDigit).ToArray());
                    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!");
}
              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
Đâ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));
              "123iuow45ss".AsEnumerable().Where(char.IsDigit)?
                    from t .. select tsự dư thừa, nhưng dù sao, chúc mừng.
                    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);
              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);
}
              Đâ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
              Đố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 ...
 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();
              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.
var match=Regex.Match(@"a99b",@"\d+");
if(match.Success)
{
    int val;
    if(int.TryParse(match.Value,out val))
    {
        //val is set
    }
}
              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.
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]
              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
Có phải điều ngược lại của một trong những câu trả lời cho câu hỏi này: Làm cách nào để xóa số khỏi chuỗi bằng 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);
                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ộ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);
              đâ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();
              Bạn sẽ phải sử dụng Regex như \d+
\d khớp các chữ số trong chuỗi đã cho.
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;
    }
              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"));
              Sử dụng câu trả lời @ tim-pietzcker từ phía trên , cách sau sẽ hiệu quả PowerShell.
PS C:\> $str = '1 test'
PS C:\> [regex]::match($str,'\d+').value
1
              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;
}