سؤال

وإضافة خيارات على الشرط في مشروعنا. تم تعيين حقل في DB لدينا عقد رقم الهاتف للسماح فقط 10 حرفا. لذا، إذا كنت الحصول على تمرير "(913) -444-5555" أو أي شيء آخر، هل هناك طريقة سريعة لتشغيل سلسلة من خلال نوع من خاص استبدال وظيفة أستطيع أن تمر عليه مجموعة من الشخصيات للسماح؟

والتعبيرات المنتظمة؟

هل كانت مفيدة؟

المحلول

وبالتأكيد التعابير المنطقية:

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 (على مسافات طويلة) أو أي شيء زائدة على x أو X (ملحقات).

نصائح أخرى

ويمكنك القيام بذلك بسهولة مع التعابير المنطقية:

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

وأنت لا تحتاج إلى استخدام التعبيرات المنتظمة.

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

وهنا الطريقة طريقة التمديد للقيام بذلك.

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

واستخدام أساليب التعبير العادي في. NET يجب أن تكون قادرة على مواكبة أي رقم غير رقمي باستخدام \ D، كما يلي:

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

وماذا عن طريقة التمديد التي لا تستخدم التعابير المنطقية.

إذا لم نتمسك أحد الخيارات التعبيرات العادية على الأقل RegexOptions.Compiled استخدامها في المتغير الثابت.

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

وهذا يبني على إجابة عثمان ظفر وتحويلها إلى مجموعة الأسلوب.

للحصول على أفضل أداء وأقل استهلاك الذاكرة، حاول هذا:

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

وأنا متأكد من أن هناك وسيلة أكثر كفاءة للقيام بذلك، ولكن أنا ربما قيام بذلك:

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

وهذه محاولة

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();
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top