খালি স্ট্রিং সহ অ-সংখ্যাগুলিকে প্রতিস্থাপন করুন


125

আমাদের প্রকল্পে প্রয়োজনে দ্রুত যোগ করুন। ফোন নম্বর ধারণ করার জন্য আমাদের ডিবিতে একটি ক্ষেত্র কেবল 10 টি অক্ষরের অনুমতি দেওয়ার জন্য সেট করা হয়েছে। সুতরাং, যদি আমি "(913) -444-5555" বা অন্য কিছু পাস করি, তবে কোনও বিশেষ প্রতিস্থাপন ফাংশন দিয়ে কোনও স্ট্রিং চালানোর কি দ্রুত উপায় আছে যা আমি এটির জন্য অক্ষরের একটি সেট পাস করতে পারি?

Regex?

উত্তর:


251

অবশ্যই রেজেক্স:

string CleanPhone(string phone)
{
    Regex digitsOnly = new Regex(@"[^\d]");   
    return digitsOnly.Replace(phone, "");
}

বা ক্লাসের মধ্যে সর্বদা পুনরায় তৈরি করতে এড়াতে:

private static Regex digitsOnly = new Regex(@"[^\d]");   

public static string CleanPhone(string phone)
{
    return digitsOnly.Replace(phone, "");
}

আপনার রিয়েল-ওয়ার্ল্ড ইনপুটগুলির উপর নির্ভর করে আপনি সেখানে স্ট্র্যাপ আউট 1 (দীর্ঘ দূরত্বের জন্য) বা কোনও এক্স বা এক্স (এক্সটেনশনের জন্য) অনুসরণ করার মতো কিছু করার জন্য কিছু অতিরিক্ত যুক্তি চাইতে পারেন।


এটা নিখুঁত. এটি কেবল কয়েকবার ব্যবহৃত হয়, সুতরাং আমাদের কোনও শ্রেণি তৈরি করার দরকার নেই, এবং শীর্ষস্থানীয় 1 হিসাবে কোনও খারাপ ধারণা নয়। তবে আমি মনে করি আমি বরং কেস ভিত্তিতে হ্যান্ডেল করব, কমপক্ষে এই প্রকল্পে। আবারও ধন্যবাদ - যদি আমি আবারও উজ্জীবিত করতে পারতাম, আমি করতাম।
ম্যাট ডাওডি

1
আমি স্ট্রিং ক্লাসের জন্য
এটির

@ জোয়েল আমি নীচে এক্সটেনশন পদ্ধতির সংস্করণ যুক্ত করেছি। অনুমান করুন মন্তব্যগুলি মার্কডাউন সমর্থন করে না।
হারুন

13
নোটটি [^\d]সরল করা যায়\D
pswg

এই উত্তরটি (ক্লাসে
রেজেক্সকে

73

আপনি এটি সহজেই রেজেক্সের সাহায্যে করতে পারেন:

string subject = "(913)-444-5555";
string result = Regex.Replace(subject, "[^0-9]", ""); // result = "9134445555"

2
দুর্দান্ত উত্তর হওয়ার জন্য উত্সাহিত, কিন্তু জোয়েল আপনাকে পরাজিত করেছে। যদিও উত্তরের জন্য ধন্যবাদ - আমি সত্যিই একাধিক উত্স থেকে নিশ্চিতকরণ দেখতে পছন্দ করি।
ম্যাট ডাওডি

@ জোসমো ন্যায্য হতে, জোয়েলকে খুব তুচ্ছভাবে একটি ওয়ান-লাইনারে রূপান্তর করা যায়। (তবে আমি উপড়েও ফেলেছি: ডি)
ম্যাজেজ জাই

40

আপনার রেজেক্স ব্যবহার করার দরকার নেই।

phone = new String(phone.Where(c => char.IsDigit(c)).ToArray())

3
নিস উত্তর, কেন RegularExpressions নামস্থান আরো রেফারেন্স যোগ
BTE

1
@ বিটিই কারণ এটি একটি স্বল্প হাত যা কেবল ব্যবহার করছেsystem.linq;
এরিক মিলিয়ট-মার্টিনেজ

1
রেজেক্স সমাধানের সাথে তুলনা করে এটি কতটা ভাল করে?
শাওয়াইস

2
লিনকিউ সমাধানের জন্য @ ম্যাক্স-পিসির বেঞ্চমার্ক কোডে একটি পরীক্ষা যুক্ত করা ফলাফল - স্ট্রিংবিল্ডার: 273 মিমি, রিজেক্স: 2096 মিমি, লিনক: 658 মিমি। স্ট্রিংবিল্ডারের চেয়ে আস্তে কম তবে রেগেক্সের থেকে এখনও উল্লেখযোগ্যভাবে দ্রুত faster প্রদত্ত যে 1,000,000 প্রতিস্থাপনের বেঞ্চমার্ক করছে, বেশিরভাগ পরিস্থিতিতে স্ট্রিংবিল্ডার এবং লিনকিউ সমাধানের মধ্যে কার্যকর পার্থক্য সম্ভবত অবহেলাযোগ্য।
ক্রিস প্র্যাট

রেগেক্সের জন্য ক্রিস্প্র্যাট, আপনি কি প্রতিবারই নতুন রেজেক্স তৈরি করেছেন, বা বিদ্যমানটি পুনরায় ব্যবহার করেছেন? এটি পারফরম্যান্সে বড় প্রভাব ফেলতে পারে।
carlin.scott

23

এটি করার এক্সটেনশন পদ্ধতিটি এখানে।

public static class Extensions
{
    public static string ToDigitsOnly(this string input)
    {
        Regex digitsOnly = new Regex(@"[^\d]");
        return digitsOnly.Replace(input, "");
    }
}

8

.NET- এ রিজেক্স পদ্ধতিগুলি ব্যবহার করে আপনার like ডি ব্যবহার করে কোনও অ-সংখ্যাসূচক সংখ্যার সাথে মিল রাখতে সক্ষম হওয়া উচিত:

phoneNumber  = Regex.Replace(phoneNumber, "\\D", String.Empty);

5
এটি মোটেই ঠিক নয়। রেজেক্সে escape এড়াতে আপনার একটি @ বা "\\ ডি" দরকার। এছাড়াও, আপনার স্ট্রিং ব্যবহার করা উচিত "" "
ব্রায়ান

5

রিজেক্স ব্যবহার না করে এমন একটি এক্সটেনশন পদ্ধতি সম্পর্কে কীভাবে।

আপনি যদি কোনও রেগেক্স বিকল্পের সাথে লেগে RegexOptions.Compiledথাকেন তবে কমপক্ষে স্ট্যাটিক ভেরিয়েবল ব্যবহার করুন ।

public static string ToDigitsOnly(this string input)
{
    return new String(input.Where(char.IsDigit).ToArray());
}

এটি উসমান জাফরের উত্তরকে একটি পদ্ধতি গোষ্ঠীতে রূপান্তর করেছে।


4

সেরা পারফরম্যান্স এবং কম স্মৃতি খরচ

using System;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;

public class Program
{
    private static Regex digitsOnly = new Regex(@"[^\d]");

    public static void Main()
    {
        Console.WriteLine("Init...");

        string phone = "001-12-34-56-78-90";

        var sw = new Stopwatch();
        sw.Start();
        for (int i = 0; i < 1000000; i++)
        {
            DigitsOnly(phone);
        }
        sw.Stop();
        Console.WriteLine("Time: " + sw.ElapsedMilliseconds);

        var sw2 = new Stopwatch();
        sw2.Start();
        for (int i = 0; i < 1000000; i++)
        {
            DigitsOnlyRegex(phone);
        }
        sw2.Stop();
        Console.WriteLine("Time: " + sw2.ElapsedMilliseconds);

        Console.ReadLine();
    }

    public static string DigitsOnly(string phone, string replace = null)
    {
        if (replace == null) replace = "";
        if (phone == null) return null;
        var result = new StringBuilder(phone.Length);
        foreach (char c in phone)
            if (c >= '0' && c <= '9')
                result.Append(c);
            else
            {
                result.Append(replace);
            }
        return result.ToString();
    }

    public static string DigitsOnlyRegex(string phone)
    {
        return digitsOnly.Replace(phone, "");
    }
}

আমার কম্পিউটারে ফলাফলটি হল:
উদ্যোগ ...
সময়: 307
সময়: 2178


মানদণ্ড দেখানোর জন্য +1। আকর্ষণীয় যে স্ট্রিংবিল্ডারের সাথে লুপটি রেজিএক্সকে ছাড়িয়ে যায়, যদিও আমি অনুমান করি যে এটি যখন বোধগম্য হয় তখন রেজিএক্স সম্ভবত কী করতে হবে তা নির্ধারণ করার জন্য প্রচুর বিধি বিধান করতে হয়েছিল।
স্টিভ ইন সিও

3

আমি নিশ্চিত যে এটি করার আরও কার্যকর উপায় আছে তবে আমি সম্ভবত এটি করব:

string getTenDigitNumber(string input)
{    
    StringBuilder sb = new StringBuilder();
    for(int i - 0; i < input.Length; i++)
    {
        int junk;
        if(int.TryParse(input[i], ref junk))
            sb.Append(input[i]);
    }
    return sb.ToString();
}

এটি ছিল আমার প্রথম প্রবৃত্তি এবং আমি এখানে কেন জিজ্ঞাসা করেছি also RegEx আমার কাছে আরও ভাল সমাধান বলে মনে হচ্ছে। তবে উত্তরের জন্য ধন্যবাদ!
ম্যাট ডাওডি

-1

এটা চেষ্টা কর

public static string cleanPhone(string inVal)
        {
            char[] newPhon = new char[inVal.Length];
            int i = 0;
            foreach (char c in inVal)
                if (c.CompareTo('0') > 0 && c.CompareTo('9') < 0)
                    newPhon[i++] = c;
            return newPhon.ToString();
        }

return newPhone.ToString();"সিস্টেম.চর []" ফিরিয়ে দেবে। আমি তোমাদের অভিপ্রেত মনে return new string(newPhone);, কিন্তু এই এছাড়া সংখ্যার 0 এবং কারণ 9 ফিল্টারিং করা হয় >এবং <পরিবর্তে >=এবং <=। তবে তারপরেও স্ট্রিংয়ের পেছনের স্থান থাকবে কারণ newPhonঅ্যারেটি এটির প্রয়োজনের চেয়ে বেশি দীর্ঘ।
juharr
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.