एक स्ट्रिंग से संख्या खोजें और निकालें


319

मुझे एक स्ट्रिंग के भीतर निहित संख्या को खोजने और निकालने की आवश्यकता है।

उदाहरण के लिए, इन तारों से:

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

मैं यह कैसे कर सकता हूँ?


2
संख्या नकारात्मक हो सकती है? यदि हां, तो "हैलो - आप कैसे हैं? -30" को कैसे संभाला जाएगा?
जॉन स्कीट

हाय जॉन, डेटा में कोई नकारात्मक संख्या नहीं
वैन

4
दशमलव संख्या पसंद है 1.5? घातीय संकेतन की तरह 1.5E45?
टिम पीटरसन


3
यहाँ कोई उत्तर क्यों स्वीकार नहीं किया गया?
विकटोरिया स्ट्रीब्यूव

जवाबों:


63

स्ट्रिंग और उपयोग के माध्यम से जाओ 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
@ थोमस: यह कोड काम नहीं करता है, इसका परिणाम होता है b == "System.Linq.Enumerable.."। सही (और यहां तक ​​कि सरल) होगाb = String.Join("", a.Where(char.IsDigit))
ब्लूराजा - डैनी पफ्लुगुएफ्ट

1
अच्छी बात है, कि मुझे कोड मैं टिप्पणी में लिखने का परीक्षण करने के लिए नहीं सिखाऊँगा! आप new string(char[])कंस्ट्रक्टर का उपयोग करके चार सरणी से एक स्ट्रिंग भी बना सकते हैं ।
थॉमस

1
रेगेक्स बहुत बेहतर काम करता है।
जेसन केली

@BlueRaja - डैनी Pflughoeft क्यों नहीं आपकी टिप्पणी एक उचित जवाब है तो मैं इसे वोट कर सकते हैं :-)
SteveC

नोट: यदि स्ट्रिंग में कई संख्याएँ हैं, तो यह उत्तर उन सभी को एक साथ एक ही संख्या में चलाएगा। उदाहरण के लिए "12345" में "a12bcd345" परिणाम। (जो लक्ष्य के आधार पर वांछनीय या नहीं हो सकता है।) यह शीर्ष-वोटेड रेगेक्स समाधान से अलग है, जो ऊपर के मामले के लिए "12" लौटाएगा। यह फोन नंबर "555-111-2222" जैसे मामलों के लिए मायने रखता है।
टूलमेकरसेव

546

\d+पूर्णांक संख्या के लिए regex है। इसलिए

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

में एक संख्या की पहली घटना युक्त एक स्ट्रिंग देता है subjectString

Int32.Parse(resultString) फिर आपको नंबर देगा।


10
नकारात्मक संख्या का समर्थन करने के लिए आप Regex.Match(subjectString, @"-?\d+").Valueइसके बजाय इस्तेमाल कर सकते हैं
जॉन सूची

45
यह उत्तर पूर्ण नहीं है (C # में)। यह केवल स्ट्रिंग में पहला नंबर प्राप्त कर रहा है। आपको मैचों से अधिक इटारेट करना होगा: resultString = string.Join (string.Empty, Regex.Matches (subjectString, @ "\ d +") .Type <Match> () चुनें (m>> m.Value));
मार्कस

8
@Markus: प्रश्न राज्यों "मैं निकालने के लिए की जरूरत है एक नंबर एक स्ट्रिंग के भीतर निहित", और सभी उदाहरण स्ट्रिंग में एक भी नंबर किया जा रहा है वर्तमान दिखा। किसी एक आइटम पर इरेटिंग करना उपयोगी नहीं है।
टिम पीटरज़्यूल

2
@ इमान: ओह, कॉमा हजारों विभाजक हैं? इसके लिए अधिक जटिल रीगेक्स की आवश्यकता होगी - जिसे एक अलग प्रश्न से निपटा जाना चाहिए। एक उत्कृष्ट प्रारंभिक बिंदु Regular-Expressions.info है जिसमें .NET के रेगेक्स इंजन पर भी अनुभाग हैं।
टिम पीत्ज़ेकर

5
@DavidSopko: आप किस बारे में बात कर रहे हैं? मूल प्रश्न एक स्ट्रिंग से एकल संख्या निकालने का तरीका पूछा गया है, शीर्षक और प्रश्न निकाय दोनों में। मूल लेखक के अलावा अन्य लोगों द्वारा प्रश्न (मेरे उत्तर के बाद और बाद में) के बाद के संपादन ने शीर्षक को "संख्या" में बदल दिया। यदि कुछ भी हो, तो उस दोषपूर्ण संपादन को वापस ले जाना चाहिए।
21:39 पर टिम पीटरज़

180

यहां बताया गया है कि मैं केवल अंक प्राप्त करने के लिए फ़ोन नंबर कैसे साफ़ करता हूं:

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

31
string numericPhone =new String(phone.Where(Char.IsDigit).ToArray());
दिमित

1
बहुत ही सुंदर समाधान .. मुझे
लाइनक

1
पूर्णांक के लिए अच्छा समाधान! इस बात से अवगत रहें कि यदि आप दशमलव संख्या को डिजिट नहीं कर रहे हैं तो आप दशमलव संख्या को पार्स करने की कोशिश कर रहे हैं तो यह काम नहीं करेगा।
एलिजा लोफग्रेन

40

नियमित अभिव्यक्ति का उपयोग करें ...

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

मैं किसी भी विराम चिह्न के बिना फोन नंबर प्राप्त करने के लिए क्या उपयोग करता हूं ...

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

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

// result: 7877636511

18

Regex.Split स्ट्रिंग्स से नंबर निकाल सकते हैं। आपको एक स्ट्रिंग में मिलने वाले सभी नंबर मिलते हैं।

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

आउटपुट:

संख्या: ४ संख्या: ४० संख्या: ३० संख्या: १०


16

यहाँ एक Linqसंस्करण है:

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

14
बस के बारे में क्या "123iuow45ss".AsEnumerable().Where(char.IsDigit)?
इल्या इवानोव

2
मुझे सिर्फ from t .. select tअतिरेक पसंद नहीं है , लेकिन फिर भी, चीयर्स।
इल्या इवानोव

14

रेगेक्स का उपयोग करते हुए एक और सरल समाधान आपको इसका उपयोग करने की आवश्यकता होनी चाहिए

using System.Text.RegularExpressions;

और कोड है

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

12

आप भी इसे आजमा सकते हैं

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

अच्छा, लेकिन यदि आप मूल स्ट्रिंग में संख्या के बीच रिक्तियां तो यह आप दोनों की संख्या के साथ 1 बड़ा concatenated स्ट्रिंग दे देंगे (कोई जगह) में शामिल हो गए
मोहम्मद Zekrallah

11

स्ट्रिंग का मिलान करने के लिए एक RegEx का उपयोग करें, फिर कनवर्ट करें:

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

9

यहां एक और Linqदृष्टिकोण है जो एक स्ट्रिंग से पहले नंबर को निकालता है।

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

उदाहरण:

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

9

दो लाइन में Regex के साथ एक स्ट्रिंग से दशमलव संख्या चाहते हैं के लिए :

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

एक ही चीज फ्लोट , लॉन्ग , आदि पर लागू होती है ...


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
यह सबसे अच्छा उत्तर है जिसने मुझे वह दिया जो मैं चाहता था, जो स्ट्रिंग के भीतर कई संख्याओं की सरणी है। यदि केवल यह संख्या (हजार विभाजक) में अल्पविराम को अनदेखा कर सकता है, तो यह सही होगा! :-)
सागर

9

आप Stringनीचे की तरह संपत्ति का उपयोग करके ऐसा कर सकते हैं :

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

जो स्ट्रिंग से केवल नंबर देता है।



7

यह प्रश्न स्पष्ट रूप से नहीं बताता है कि आप केवल वर्ण 0 से 9 चाहते हैं, लेकिन यह विश्वास करना खिंचाव नहीं होगा कि यह आपके उदाहरण सेट और टिप्पणियों से सत्य है। तो यहाँ वह कोड है जो ऐसा करता है।

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

आप Char.IsDigit () का उपयोग क्यों नहीं करना चाहते हैं - संख्याओं में अंश, सदस्यता, सुपरस्क्रिप्ट, रोमन अंक, मुद्रा संख्या, घेरे गए नंबर और स्क्रिप्ट-विशिष्ट अंक जैसे वर्ण शामिल हैं।


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

स्ट्रिंग में सभी नंबर प्राप्त करें। इसलिए यदि आप '1 प्लस 2' की परीक्षा में उपयोग करते हैं तो उसे '12' मिलेगा।


5

एक्सटेंशन पद्धति एक स्ट्रिंग में निहित सभी सकारात्मक संख्याएँ प्राप्त करने के लिए :

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

यदि आप ऋणात्मक संख्याएँ चाहते हैं और साथ ही इस कोड को संशोधित करके माइनस साइन को संभाल सकते हैं (- )

इस इनपुट को देखते हुए:

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

परिणामी संख्या सूची इस प्रकार होगी:

[1989, 27, 2016]

5

यदि संख्या में दशमलव अंक हैं, तो आप नीचे उपयोग कर सकते हैं

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

परिणाम:

"कुछ भी 876.8 कुछ भी" ==> 876.8

"कुछ भी 876 कुछ भी" ==> 876

"$ 876435" ==> 876435

"$ 876.435" ==> 876.435

नमूना: https://dotnetfiddle.net/IrtqVt


1
इस उत्तर के लिए बहुत बहुत धन्यवाद। मैं C # और VS2017 का उपयोग कर रहा हूं और यह पता लगाने की कोशिश कर रहा हूं कि मुझे मूल्य कैसे मिलेगा। आपके उत्तर के लिए फिर से धन्यवाद।
बुलबुले


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

यह कोड एक स्ट्रिंग में सभी पूर्णांक मान को खोजने के लिए उपयोग किया जाता है।
मनोज गुप्ता

टिप्पणी के रूप में अलग से पोस्ट करने के बजाय सीधे उत्तर में कुछ विवरण जोड़ना बेहतर होगा। टिप्पणियां हमेशा तुरंत दिखाई नहीं देती हैं।
जॉन ड्वोरक

2

अहमद माजिद द्वारा यहां एक दिलचस्प दृष्टिकोण प्रदान किया गया है, जिसमें वे स्ट्रिंग में दिखाई देते हैं, पूर्णांक निकालने के लिए रेगेक्स और स्ट्रिंगर का उपयोग करते हैं।

अहमद मजीद द्वारा पोस्ट के आधार पर Regex.Split का उपयोग करने वाला एक उदाहरण इस प्रकार है:

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

यहाँ मेरा एलगोरिदम है

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

यहाँ मेरा समाधान है

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

आप के रूप में Regex का उपयोग करना होगा \d+

\d दिए गए स्ट्रिंग में अंकों से मेल खाता है।


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

पिछले नमूने के आधार पर मैंने एक विधि बनाई:

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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.