我是C#中正则表达式的新手。我不知道如何使用正则表达式来验证客户端引用号。此客户参考号有3种不同的类型:ID,手机号和序列号。
C#:
string client = "ABC 1234567891233";
//do code stuff here:
if Regex matches 3-4 digits to client, return value = client id
else if Regex matches 8 digts to client, return value = ref no
else if Regex matches 13 digits to client, return value = phone no
我不知道如何使用Regex为不同类型计算数字。像正则表达式(“{![\ d .....}”)。
答案 0 :(得分:3)
我不明白你为什么要在这里使用正则表达式。一个简单的单线程就可以做到,例如。甚至这样的扩展方法:
static int NumbersCount(this string str)
{
return str.ToCharArray().Where(c => Char.IsNumber(c)).Count();
}
我认为它更清晰,更易于维护。
你可以用组匹配和
之类的东西来试试"(?<client>[0-9]{5,9}?)|(?<serial>[0-9]{10}?)|(?<mobile>[0-9]{13,}?)"
然后你要检查你是否匹配“client”,“serial”,“mobile”并在此基础上解释字符串输入。但是它更容易理解吗?
对于那些稍后阅读您的代码的人来说,它是否更清楚地表达了您的意图?
如果要求是这些数字必须是连续的(正如@Corak指出的那样)......我仍然会迭代地写这个数字,如下所示:
/// <summary>
/// returns lengths of all the numeric sequences encountered in the string
/// </summary>
static IEnumerable<int> Lengths(string str)
{
var count = 0;
for (var i = 0; i < str.Length; i++)
{
if (Char.IsNumber(str[i]))
{
count++;
}
if ((!Char.IsNumber(str[i]) || i == str.Length - 1) && count > 0)
{
yield return count;
count = 0;
}
}
}
然后你可以简单地说:
bool IsClientID(string str)
{
var lenghts = Lengths(str);
return lenghts.Count() == 1 && lenghts.Single() == 5;
}
它更冗长吗?是的,但是,每当验证规则发生变化,或者需要进行一些调试时,人们仍然会更喜欢你,就像你让他们摆弄正则表达式一样:)这包括你未来的自我。
答案 1 :(得分:0)
我不确定我是否理解你的问题。但是,如果要从字符串中获取数字字符的数量,可以使用以下代码:
Regex regex = new Regex(@"^[0-9]+$");
string ValidateString = regex.Replace(ValidateString, "");
if(ValidateString.Length > 4 && ValidateString.Length < 10)
//this is a customer id
....