手机号码、邮箱匹配正则表达式java实现练手

概念:正则表达式就是用某种模式去匹配一类字符串的一个公式。它由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。
正则表达式的基础语法为: “^([]{})([]{})([]{})$”。
大致意思是:正则字符串 = “开始([包含内容]{长度})([包含内容]{长度})([包含内容]{长度})结束”。 今天我学习了一下简单的基础知识,尝试写一下手机号码和邮箱的正则匹配练习一下。

一、手机号码正则表达式:
手机号码一般为1开头11位数字,其正则匹配表达式可为:1[0-9]{10}
[0-9]表示0到9之间任意一个数字(也可以用\d表示),{10}表示前面的表达式匹配10次;java字符串匹配时增加表达开始和结束的元字符^$.
Java代码测试如下:

/** 
     * 判断是否为正确的手机格式
     * @param str 
     * @return boolean 
     */ 
    public static boolean isMobile0(String str){
         if(str == null || "".equals(str)){  
               return false;
            }
            return str.matches("^1[0-9]{10}$");  

    }
    public static void main (String[] str){
      String mobile = "12345678901";
      boolean y = isMobile0(mobile);
      System.out.println(y);
   }

运行结果为:true
这里主要数字串满足1开头11为数字即可,存在比较大的匹配隐患。

进阶1:国内的手机号码开头号码段有以下:
移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147
联通号码段:130、131、132、136、185、186、145
电信号码段:133、153、180、189
即开头为13|14|15|18四种,|表示或的意思;再细致一些则有(13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]),Java代码测试如下:

  /** 
     * 判断是否为正确的手机格式
     * @param str 
     * @return boolean 
     */ 
    public static boolean isMobile0(String str){
         if(str == null || "".equals(str)){  
               return false;
            }
         //return str.matches("^1[0-9]{10}$");
         //return str.matches("^1\\d{10}$");
         //return str.matches("^(13|14|15|18)\\d{9}$");  
         //return str.matches("^((13[0-9])|(14[5|7])|(15[0-3])|(15[5-9])|(18[0,5-9]))\\d{8}$");  
         return str.matches("^1((3[0-9])|(4[5|7])|(5([0-3]|[5-9]))|(8[0,5-9]))\\d{8}$");

    }
    public static void main (String[] str){
      String mobile = "12345678901";
      String mobile2 = "13660188000";
      boolean n = isMobile0(mobile);
      System.out.println(n);
      boolean y = isMobile0(mobile2);
      System.out.println(y);

   }

返回结果为:false true;
第一个String字段因为号段不对被筛选出来了。

进阶2:增加了国字区号,比如我国+86的号码如何判断
在原有的基础前面,增加+86或86的判断,用?表示匹配一次或0次

   /** 
     * 判断是否为正确的手机格式
     * @param str 
     * @return boolean 
     */ 
    public static boolean isMobile0(String str){
         if(str == null || "".equals(str)){  
               return false;
            }
         //return str.matches("^1[0-9]{10}$");
         //return str.matches("^1\\d{10}$");
         //return str.matches("^(13|14|15|18)\\d{9}$");  
         //return str.matches("^((13[0-9])|(14[5|7])|(15[0-3])|(15[5-9])|(18[0,5-9]))\\d{8}$");  
         //return str.matches("^1((3[0-9])|(4[5|7])|(5([0-3]|[5-9]))|(8[0,5-9]))\\d{8}$");
         return str.matches("^(\\+86|86)?1((3[0-9])|(4[5|7])|(5([0-3]|[5-9]))|(8[0,5-9]))\\d{8}$");

    }
    public static void main (String[] str){
      String mobile = "12345678901";
      String mobile2 = "13660188000";
      String mobile3 = "+8613660188000";
      String mobile4 = "8613660188000";
      System.out.println(isMobile0(mobile));
      System.out.println(isMobile0(mobile2));
      System.out.println(isMobile0(mobile3));
      System.out.println(isMobile0(mobile4));     
   }

测试结果为:false true true true;

二、手机号码正则表达式
邮箱正常格式为:用户名@域名;

用户名分析:用户名一般由英文字母,中划线,下划线,数字等组成,由此确定正则表达式可为[0-9a-zA-Z-_]+;
而正则表达式有\w可用于匹配包括下划线的单词字符,即\w 等价于 [0-9a-zA-Z_],上式可以表达为 [\w-](java中要注意转义);

域名分析:国际规定域名格式[N级域名][三级域名.]二级域名.顶级域名;至少有两级域名;而域名的表达也可以用[\w-]表示。
那么邮箱的匹配正则表达式可为:^[\w-]+@[\w-]+([.][\w-]+)+$
考虑转义字符等,在java中的实现和测试是:

    /** 
     * 判断是否为正确的邮件格式 
     * @param str 
     * @return boolean 
     */  
    public static boolean isEmail(String str){  
        if(str == null || "".equals(str)){  
            return false;
         }
        return str.matches("^[\\w-]+@[\\w-]+(\\.[\\w-]+)+$");  
    }  

    public static void main (String[] str){
         String email1 = "abc2_-@susy.com.cn";
         String email2 = "a@";
         System.out.println(isEmail(email1));
         System.out.println(isEmail(email2));
   }

结果返回 true false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值