黑马程序员--正则表达式

 ---------------------- 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次或更多次

下面是些常用的元字符

 

表1.常用的元字符
代码说明
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符
\d匹配数字
\b匹配单词的开始或结束
^匹配字符串的开始
$匹配字符串的结束
表2.常用的限定符
代码/语法说明
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次

 

表3.常用的反义代码
代码/语法说明
\W匹配任意不是字母,数字,下划线,汉字的字符
\S匹配任意不是空白符的字符
\D匹配任意非数字的字符
\B匹配不是单词开头或结束的位置
[^x]匹配除了x以外的任意字符
[^aeiou]匹配除了aeiou这几个字母以外的任意字符

表4.常用分组语法
分类代码/语法说明
捕获(exp)匹配exp,并捕获文本到自动命名的组里
(?<name>exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp)匹配后面跟的不是exp的位置
(?<!exp)匹配前面不是exp的位置
注释(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

表5.懒惰限定符
代码/语法说明
*?重复任意次,但尽可能少重复
+?重复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.时,它会匹配singdanc

(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading

零宽度负预测先行断言(?!exp)断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词

同理,我们可以用(?<!exp),零宽度负回顾后发断言断言此位置的前面不能匹配表达式exp(?<![a-z])\d{7}匹配前面不是小写字母的七位数字

a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)ab(第四到第五个字符)

 ---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值