---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
什么是正则表达式
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
这是一道题,判断字符串是否为正确的国内电话号码,不考虑分机。比如“010-95555”、“01095555”、“95555”都是正确的号码。区号为3位或者4位。
一开始我做的话,是想先看电话号码里面是否有‘-’,有的话再通过分离‘-’去判断其他的长度是否符合,是否都是数字;没有的话则判断长度是否符合,是否都是数字,这是我写的代码
static void Main(string[] args)
{
Console.WriteLine("请输入电话号码");
string phonenumber = Console.ReadLine();//定义一个string类型的phonenumber接收用户输入的电话号码
if (phonenumber.IndexOf('-') == -1)//电话号码中没有'-'的情况
{
if (IsNumber(phonenumber)==true)
{
//判断字符串长度是否正确,当字符串长度为5.8.9,号码是正确的
if (phonenumber.Length == 5 || phonenumber.Length == 8 || phonenumber.Length == 9)
{
Console.WriteLine("你输入的电话号码是正确的国内电话号码");
}
else//字符串长度不正确
{
Console.WriteLine("你输入的电话号码长度不合法");
}
}
else//当不是正整数的时候
{
Console.WriteLine("你输入的电话号码错误");
}
}
else//当电话号码中包含'-'的情况
{
string[] newphone = phonenumber.Split('-');
string firstnewphone = newphone[0];
string lastnewphone = newphone[1];
//如果分离后的字符串长度错误
if ((firstnewphone.Length != 3 && firstnewphone.Length != 4) || lastnewphone.Length != 5)
{
Console.WriteLine("你输入的电话号码错误");
}
else//如果字符串长度正确
{
//调用IsNumber方法判断是否都是正整数,如果是的话
if (IsNumber(firstnewphone) == false || IsNumber(lastnewphone) == false)
{
Console.WriteLine("你输入的电话号码错误");
}
else//如果不是正整数
{
Console.WriteLine("你输入的电话号码是正确的国内电话号码");
}
}
}
Console.ReadKey();
}
static bool IsNumber(string str)//定义一个bool类型的方法,判断传进来的字符串是否都是正整数
{
char[] toNumber = str.ToCharArray();//把传进来的字符串转化成一个字符数组
for (int i = 0; i < toNumber.Length;i++)
{
if (toNumber[i] > 57 || toNumber[i] < 48)
{
return false;
}
}
return true;
}
虽然写出来了,但是过于复杂,当时发现有人推荐用正则表达式,说可以简化很多,但当时还不是很明白,所以就这样写出来。后来写完后有时间,在http://deerchao.net/tutorials/regex/regex.htm这里就仔细的看了下正则表达式的大概,发现可以简化很多
static void Main(string[] args)
{
string testPhone = Console.ReadLine(); //输入测试号码
if (IsPhone(testPhone) == true)
{
Console.WriteLine("正确的");
}
else
{
Console.WriteLine("错误的");
}
Console.ReadKey();
}
public static bool IsPhone(string strphone)
{
return Regex.IsMatch(strphone, @"^0\d{2}[- ]?\d{5}$|^0\d{3}[- ]?\d{5}$|^\d{5}$");
}
这样的话就可以很简单了。
下面是摘抄的一些基本知识
\b是正则表达式规定的一个特殊代码(某些人叫它元字符),代表单词的开头或结尾。.是另一个元字符匹配换行符以外任意字符。*也是元字符,它指定*前面的内容可以连续重复使用人一次。.*连在一起就意味着任意数量的不包含换行的字符。\d+匹配1个或更多连续的数字。这里的+是和*类似的元字符,不同的是*匹配重复任意次(可能是0次),而+则匹配重复1次或更多次。
下面是些常用的元字符
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
分类 | 代码/语法 | 说明 |
---|---|---|
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
(? |
匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) | |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 | |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 | |
(?!exp) | 匹配后面跟的不是exp的位置 | |
(? | 匹配前面不是exp的位置 | |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
代码/语法 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
元字符^和$都匹配一个位置,这和\b有点类似。^匹配你要用来查找的字符串的开头,$匹配结尾。如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$。
正则表达式引擎会提供一个“测试制定的字符串是否匹配一个正则表达式”的方法,DotNet里面的是Regex.IsMatch()方法。
[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。
像[0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)。
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。
同理,我们可以用(?零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?匹配前面不是小写字母的七位数字。
a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------