A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 武汉分校-小舞 于 2016-4-12 10:37 编辑

【武汉校区】分享:Java的正则表达式

学习正则表达式首先要知道正则表达式是干什么用的?正则表达式是专门用于对字符串进行操作的。
        例如1:登录QQ的时候,QQ号码有一定的规则,不满足它的规则,不让登录。那么在登录的时候就有一个判断
                        判断你输入的字符串是否是满足QQ号码的规则
        例如2:注册邮箱的时候,你输入的字符串不满足邮箱的规则,就不让你注册。
                        在注册的时候就要判断你输入的字符串是否满足邮箱的规则。满足规则才让注册,否则不让注册
                        
        ...像这样的对字符串的操作还有很多
        
        其实正则表达式就是一种规则,这种规则是用字符串表示的。所以正则表达式注意两点
                1,本质是是一个字符串
                2,它表示一种规则
        
       正则表达式的语法规则
                每一种程序语言都有正则表达式,基本语法其实都是一样的,这里讲解的是Java语言的正则表达式。
                在Java语言当中,用一些特定的字符组成的字符串,来表示一些特定的规则。具体规则在API Pattern类中有详细说明(这里只提取了一部分简单易懂内容)
                        
                下面列举了一些常见的正则表达式匹配规则:

                字符
                x                         字符 x         (例如:一个字符'a'就匹配一个字符'a',一个字符'1'就匹配一个字符'1')
                \\                         反斜线字符 (用"\\"表示"\")
                \t                         制表符 ('\u0009')         
                \n                         新行(换行)符 ('\u000A')
                \r                         回车符 ('\u000D')
                window换行用  \r\n表示
               
                字符类
                [abc]                 a、b 或 c(简单类)
                        注意:[abc]只表示匹配1个a,或者1个b,或者1个c
                [^abc]                 任何字符,除了 a、b 或 c(否定)
                        注意:[^abc]只表示匹配1个除了a或者b或者c的其他字符
                [a-zA-Z]         a 到 z 或 A 到 Z,两头的字母包括在内(范围)
                        注意:[a-zA-Z]只表示匹配一个字母(大写或者小写都可以)
                [0-9]                表示匹配所有的数字
               
                预定义字符类
                        .                         任何字符(与行结束符可能匹配也可能不匹配)
                        \d                         数字:[0-9]
                        \D                         非数字: [^0-9]
                        \s                         空白字符:[ \t\n\x0B\f\r]
                        \S                         非空白字符:[^\s]
                        \w                         单词字符:[a-zA-Z_0-9]
                        \W                         非单词字符:[^\w]
                        
                边界匹配器
                        ^                         行的开头
                        $                         行的结尾
                        \b                         单词边界
                        \B                         非单词边界
                        
                Greedy 数量词
                        X? X,一次或一次也没有
                        X* X,零次或多次
                        X+ X,一次或多次
                        X{n} X,恰好 n 次
                        X{n,} X,至少 n 次
                        X{n,m} X,至少 n 次,但是不超过 m 次
                        
        
                再回头看一下开头的的那两个需求:
                        例1:校验字符串是否为QQ号码
                                首先要知道QQ号码的规则,这个规则可以用正则表达式来表示
                                规则:
                                        1,首位不能是0
                                        2,只能是数字
                                        3,5到11位数字组成
                                就可以用一个字符串表示这个规则,那么这个字符串就是正则表达式
                                        String regex="[1-9]//d{4,10}" //[1-9]表示匹配第一个字符是1-9其中的一个,除了第一个字符,//d{4,10}表示数字可以出现4到10次
                                       
                                        String qq="87981176";//这个一个QQ号码
                                        boolean b=qq.matches(regex);//用正则表达式匹配这个QQ号码
                                        System.out.println(b);//true,匹配成功返回true
                        例2:校验字符串是否为邮箱
                                首先要知道邮箱号码的规则,这个规则可以用正则表达式来表示
                                规则:huhan@qq.com
                                        从左往右下面几部分组成
                                        1,字母数字或下划线,
                                                        一次或多次
                                        2,@符号        
                                                        一个
                                        3,字母数字或下划线        
                                                        一次或多次
                                        4,.                                
                                                        一个
                                        5,字母数字或下划线        
                                                        一次或多次
                                       
                                        把上面的规则用正则表达式表示
                                                String regex="\\w+[@]\\w+[\\.]\\w+";//邮箱的正则表达式
                                                String email="huhan@qq.com";
                                                boolean b=emial.matches(regex);
                                                System.out.println(b);//true,匹配成功
                                       
                对字符串的操作除了匹配,还有切割和替换,以及获取等等
                        切割
                                需求:把字符串用数字进行分割
                                String str="aaaa78bbbb788ccc6600ddd8fff";
               
                                //数字的正则表达式,+表示匹配多次
                                String regex="\\d+";
                                
                                String[] strs = str.split(regex);
                        
                        替换
                                需求:论坛上不允许出现电话号码,将电话号码屏蔽掉用"*"代替
                                        String s="我的电话号码是:13797145678";
                                       
                                        //数字的规则可以用[0-9]表示或者//d,把所有的数字,都就替换成*
                                        s.replaceAll("[0-9]","*");
                                       
                        获取
                                获取功能的步骤:
                                        A:定义一个正则表达式
                                                String regex="[1][0-9]{10}";
                                        B:把正则表达式编译到模式当中
                                                Pattern pattern=Pattern.compile(regex);
                                        C:用模式去匹配需要匹配的字符串
                                                Matcher mather=pattern.matcher("我的手机号码是:13797165578");
                                        D:用Matcher去获取匹配的字符
                                                boolean flag=macther.find(); //去找是否有需要配的下一子序列
                                                if(flag){//如果找到了
                                                        String str=macther.group();//获取找到的字符串
                                                        System.out.println(str);
                                                }
                        
                                
        在实际开发中正则表达式一般都不用自己写,因为要写好一个正则表达式也比较繁琐,并不是那么容易,网上已经有很多整理好的正则表达式可以直接拿过来用。

下面就是整理好的一些正则表达式
=================================================================================================================================================
  2 整数或者小数:^[0-9]+\\.{0,1}[0-9]{0,2}$
  3 只能输入数字:"^[0-9]*$"。
  4 只能输入n位的数字:"^\\d{n}$"。
  5 只能输入至少n位的数字:"^\\d{n,}$"。
  6 只能输入m~n位的数字:。"^\\d{m,n}$"
  7 只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
  8 只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。
  9 只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。
10 只能输入非零的正整数:"^\\+?[1-9][0-9]*$"。
11 只能输入非零的负整数:"^\\-[1-9][]0-9"*$。
12 只能输入长度为3的字符:"^.{3}$"。
13 只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。
14 只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。
15 只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。
16 只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。
17 只能输入由数字、26个英文字母或者下划线组成的字符串:"^\\w+$"。
18 验证用户密码:"^[a-zA-Z]\\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
19 验证是否含有^%&',;=?$\\"等字符:"[^%&',;=?$\\x22]+"。
20 只能输入汉字:"^[\\u4e00-\\u9fa5]{0,}$"
21 验证Email地址:"^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"。
22 验证InternetURL:"^http://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$"。
23 验证电话号码:"^(\\(\\d{3,4}-)|\\d{3.4}-)?\\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
24 验证身份证号(15位或18位数字):"^\\d{15}|\\d{18}$"。
25 验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。
26 验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。
27 匹配中文字符的正则表达式: [\\u4e00-\\u9fa5]
28 匹配双字节字符(包括汉字在内):[^\\x00-\\xff]
29 应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
30 String.prototype.len=function(){return this.replace(/[^\\x00-\\xff]/g,"aa").length;}
31 匹配空行的正则表达式:\\n[\\s| ]*\\r
32 匹配html标签的正则表达式:<(.*)>(.*)<\\/(.*)>|<(.*)\\/>
33 匹配首尾空格的正则表达式:(^\\s*)|(\\s*$)

想获取最新传智播客武汉中心分享技术文章请加QQ  1641907557 ,后期会分享更多与实体班同步教程,助你冲击月薪20K!

1 个回复

倒序浏览
谢谢,刚好看到,先收藏
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马