استبدال غير رقمية مع سلسلة فارغة
-
06-07-2019 - |
سؤال
وإضافة خيارات على الشرط في مشروعنا. تم تعيين حقل في 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();
}