相信大家在写判断用户输入的时候,都很痛苦,不仅逻辑乱,而且特别影响系统的性能,那么怎么办呢?就用正则表达式,优点是简洁,高效。
为什么要用正则表达式?
如果你要判断用户输入的qq号是否合法,常规的C#代码大概应该这样写:
1、首先判断是否都为数字
2、然后首位是否为0
3、最后判断是否是5到10位之间
用C#代码(不使用正则表达式)
/// <summary>
/// 判断QQ号是否合法
/// </summary>
/// <param name="QQ">要检测的QQ号</param>
/// <returns></returns>
public static bool Check(string QQ)
{
//定义变量,用来接收判断是否是数字的结果
bool isNumber = true;
//判断是否全部为数字
for (int i = 0; i < QQ.Length; i++)
{
if (QQ[i]>='0'&& QQ[i]<='9')
{
isNumber = false;
break;
}
}
//判断首位是否为0
bool isZeroStart = !(QQ[0] == '0');
//判断长度是否在5到10之间
bool length = QQ.Length >= 5 && QQ.Length <= 10;
//返回结果
return isNumber && isZeroStart && length;
}
C#代码(使用正则表达式)
/// <summary>
/// 判断QQ号是否合法
/// </summary>
/// <param name="QQ"></param>
/// <returns></returns>
public static bool Check(string QQ)
{
//用正则表达式来写
bool resule= Regex.IsMatch(QQ, "^[1-9]\\d{4,9}$");
//返回结果
return resule;
}
是不是感觉正则表达式很简单,其实没错,就是你想的这样!
注意事项:
1、首先在C#中,使用正则表达式需要导入命名空间using System.Text.RegularExpressions;//正则表达式的命名空间
2、其次这个正则表达式是非常坑的,为啥坑呢?因为它属于一个字符串,字符串是没有任何的语法提示的。
3、然后正则表达式写的时候要注意,因为如果写错了,系统会直接崩掉,容错率较差。
4、正则表达式对于每一种语言,它的语法是相同的,例如:无论是C#,java,C还是任何一种语言都有自己的语法,但是像正则表达式,它的语法是通用的,换句话说,如果你忘记了语法,那么你就可以通过百度百科中很容易找到相应的语法。
下面这个表格中,记录我们正则表达式中常用的语法,先看一看,看不懂没关系,耐心看下去,下面有例子等着你。
符号 | 含义 |
---|---|
^ | 用来匹配一个字符串的开头 C#中必须加上 但是java默认加上去 |
$ | 用来匹配一个字符串的结束 |
[] | 匹配一位字符,这一位字符可以是这个括号中的任何一个 |
[1-9] | 这一位字符可取的范围是1到9 |
[a-z] | 这一位字符可取的范围是a到z |
[^1-9] | 这一位字符可以是[1,9]以外的任何字符 |
+ | 前面的一位字符连续出现了1次或多次 |
* | 前面的一位字符连续出现了0次或多次 |
? | 前面的一位字符连续出现了0次或1次 |
{m} | 前面的一位字符连续出现了m次 |
{m,} | 前面的一位字符最少连续出现了m次 |
{,n} | 前面的一位字符最多连续出现了n次 |
{m,n} | 前面的一位字符出现了[m,n]次 |
\d | 表示[0,9] |
\w | 表示[a,z]&[A,Z] |
\D | 表示[^0,9] |
. | 通配符,可以匹配任意字符 |
() | 分组 |
举例:
1、判断手机号是否合法:
1、首先手机号是十一位,并且每一位都是数字2、其次手机号是以1开头,并且在我印象里,手机号第二位只有3、4、5、7、8
/// <summary>
/// 判断手机号是否合法
/// </summary>
/// <param name="number">要判断的手机号</param>
/// <returns></returns>
public static bool CheckPhoneNumber(string number)
{
//正则表达式
string pattern = "^1[34578]\\d{9}$";//确定语法规则
return Regex.IsMatch(number, pattern);//判断语法是否相同,如果相同返回True,否则返回False
}
判断邮箱是否合法:
1、首先邮箱中肯定有一个'@'字符2、其次邮箱中肯定是以".com"结束
3、邮箱可以是以数字、大小写字母、_、!等开头
/// <summary>
/// 判断邮箱是否合法
/// </summary>
/// <param name="email">要检测的邮箱</param>
/// <returns></returns>
public static bool CheckEmail(string email)
{
string patten = "^[0-9a-zA-Z_\\.]+@[0-9a-zA-Z]+\\.com$";
return Regex.IsMatch(email, patten);
}
Replace方法的使用
这个方法可以去掉字符串中的某类的字符,举个例子:把下列字符串中的空格变换成逗号。
string str = "James Curry Rose Paul Harden Durant ";
/// <summary>
/// 把字符串的空格转化为逗号
/// </summary>
/// <param name="str">要转换的字符</param>
/// <returns></returns>
public static string FixName(string str)
{
string pattern = " {2,}";//正则表达式语法,含义是连续两个或两个以上的空格
//返回字符串,第一个参数是要判断的字符,第二个参数是判断的规则,第三个参数是替换的目标字符
return Regex.Replace(str, pattern, ",");
}
1、首先该方法是Regex类的一个静态方法,调用该方法的时候,只需要用类名.方法名
2、其次该方法有三个参数:第一个参数是要判断的字符,第二个参数是判断的规则,第三个参数是替换的目标字符
屏蔽手机号的中间四位
/// <summary>
/// 判断电话是否合法
/// </summary>
/// <param name="phone">你要检测的电话号码</param>
/// <returns></returns>
public static string CheckPhone(string phone)
{
//正则表达式,通过分组
string pattern = "^(1[34578]\\d)(\\d{4})(\\d{4})$";
//获取到一个匹配的结点
Match match = Regex.Match(phone, pattern);
//获得所有的分组
GroupCollection groups = match.Groups;
string group1 = groups[1].Value;
string group3 = groups[3].Value;
//将这些分组连接起来
return group1+"****"+group3;
}
感谢您的阅读,希望我的分享对你有所帮助,加油!