我们项目中迅速增加的需求。我们数据库中用于保存电话号码的字段只允许10个字符。因此,如果我传递了“(913)-444-5555”或其他任何字符,是否有一种快速的方法可以运行字符串通过某种特殊的替换函数,我可以通过传递一组允许字符?
正则表达式?
我们项目中迅速增加的需求。我们数据库中用于保存电话号码的字段只允许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", String.Empty);
使用不使用正则表达式的扩展方法如何。
如果您坚持使用正则表达式选项之一,请至少在静态变量中使用RegexOptions.Compiled
。
public static string ToDigitsOnly(this string input)
{
return new String(input.Where(char.IsDigit).ToArray());
}
这是在Usman Zafar的答案的基础上转换为方法组。
为了获得最佳性能和更低的存储器消耗,请尝试这样做:
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, "");
}
}
The result in my computer is:
Init...
Time: 307
Time: 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();
}
试一下 (shì yí xià)
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();
}