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

来源:互联网 发布:淘宝怎么不能找人代付 编辑:程序博客网 时间:2024/05/21 20:24

概念:正则表达式就是用某种模式去匹配一类字符串的一个公式。它由一些普通字符和一些元字符(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

阅读全文
0 0
原创粉丝点击