正则表达式

1 概念

正则表达式:regex
          给字符串定义正确规则的字符串表达式
api:参考String
  • 涉及正则表达式的String方法
* boolean matches(String regex)  :判断当前字符串是否匹配参数正则表达式
* String replaceAll(String regex, String replacement) 
                                 :使用replacement替换当前字符串中与参数正则表达式匹配的所有子串
* String replaceFirst(String regex, String replacement)  
                                 :使用replacement替换当前字符串中与参数正则表达式匹配的第一个子串
* String[] split(String regex)   :使用与参数正则表达式匹配的所有子串 切割当前字符串               

2 正则表达式

2.0 需求:

判断是否是手机号
//验证手机号
public static boolean test01Phone(String number){
    if(number.length()!=11){
        return false;
    }
    //判断第一个字符是不是1
    if(number.charAt(0)!='1'){
        return false;
    }
    //第二个字符:3/4/5/6/7/8/9
    if(number.charAt(1)<'3'||number.charAt(1)>'9'){
        return false;
    }
    //其他字符必须是数字
    for (int i = 2; i <number.length(); i++) {
        char c=number.charAt(i);
        if(!Character.isDigit(c)){
            return false; 
        }
    }
    return true;
}
//正则表达式验证手机号
public static boolean test02Phone(String number){
    //定义一个字符串:表示规则
    String regex="1[3-9][0-9]{9}";//代码量少:但可读性差
    //调用string的方法 使用规则
    return number.matches(regex);
}

2.1 使用正则的方式:(了解)

//正则表达式验证手机号
public static boolean test02Phone(String number){
    //定义一个字符串:表示规则
    String regex="1[3-9][0-9]{9}";//代码量少:但可读性差
    //调用string的方法 使用规则
    return number.matches(regex);//调用的是字符串的matches方法
}
//正则表达式验证手机号
public static boolean test03Phone(String number){
    Pattern p = Pattern.compile("1[3-9][0-9]{9}");//创建一个正则对象  并关联正则规则
    Matcher m = p.matcher("aaaaab");//定义正则对象的matcher方法 关联需要判断的字符串  获取匹配器对象
    boolean b = m.matches();//调用匹配器对象的matches方法 获取结果
    //调用string的方法 使用规则
    return b;
}

2.2 总结

正则表达式 :使用一些特殊字符来表示固定的规则
学习重点: 有那些特殊字符  这些特殊字符都表示什么规则

3 正则表达式的规则

3.1 字符

x  : 非特殊字符x 就表示x
.  : 任意字符
\  : 转义字符
\. : 字符.
\\ : 字符\
^  : 字符串开头
$  : 字符串结尾

3.2 范围:[]

[acfg]  : acfg中的任意一个字符
[a-z]   :编码表中a到z中的任意一个字符
[a-zB-F] :编码表中a到z和B到F中的任意一个字符
[^a-f]   :除了a-f以外的任意一个字符
[a-z&&[d-g]]:取[a-z]与[d-g]的交集  等价于[d-g]

3.3 特殊范围

\d  :所有数字字符  等价于[0-9]
\D  :所有非数字字符  等价于[^0-9]
\w  :所有单词字符  等价于[a-zA-Z_0-9]
\W  :所有非单词字符  等价于[^a-zA-Z_0-9]
\s  :所有空白字符  等价于[ \t\n\x0B\f\r]
\S  :所有非空白字符  等价于[^\s]

3.4 次数:{}

a?  :  a出现小于等于1次
a*  :  a出现大于等于0次 
a+  :  a出现大于等于1次
a{n} :  a出现n次
a{n,} : a出现大于等于n次
a{n,m} : a出现大于等于n次 小于等于m次

3.5 复用:()

([a-z][0-9])+   :a3  a3b4n5

3.6 汉字

[\u4e00-\u9fa5]

4 测试方法

4.1 matches方法

//boolean matches(String regex)  :判断当前字符串是否匹配参数正则表达式
public static void main(String[] args) {
    while(true){
        System.out.println("请输入字符串!");
        String line=new Scanner(System.in).nextLine();
        test05(line);
    }
}
//1 判断用户名是否合法:由数字字母下划线组成  但不能以数字下划线开头  由6到8位
public static void test01(String s){
    //1 定义字符串表示正则规则
    String regex="[a-zA-Z][a-zA-Z0-9_]{5,7}";
    //2 调用字符串的方法判断
    boolean b=s.matches(regex);
    System.out.println(s+"::是否匹配规则:(由数字字母下划线组成  但不能以数字下划线开头  由6到8位)::"+b);
}
//2判断邮箱:miaotianbao@163.com
//        昵称@邮箱服务器名称 多个后缀
public static void test02(String mail){
    //1 定义字符串表示正则规则
    String regex=".+";//.+ 任意字符 规则出现大于等于1次 :a  aa  ab
    regex=".+@.+(\\.[a-zA-Z]+)+";//.+ 任意字符 规则出现大于等于1次 :a  aa  ab
    //2 调用字符串的方法判断
    boolean b=mail.matches(regex);
    System.out.println(mail+"::是否匹配规则:(是否是邮箱)::"+b);
}

//3 判断是不是中文名字
//        汉字:2-4个
public static void test03(String name){
    //1 定义字符串表示正则规则:[\u4e00-\u9fa5]
    String regex="[\u4e00-\u9fa5]{2,4}";
    //2 调用字符串的方法判断
    boolean b=name.matches(regex);
    System.out.println(name+"::是否匹配规则:(是否是名字)::"+b);
}
//4判断字符串是不是叠词:aaaaaa   bb  ccccc 11111
public static void test04(String s){
    //1 定义字符串表示正则规则:
    String regex="(.)\\1+";//()表示封装:组
    regex="^(.)\\1+$";//字符串开头和字符串结尾
    //(.) :把此位置处的字符封装为一个组:组名字从1开始
    //\\1 :第一组的结果再出现一次
    //\\1+ :第一组的结果再出现>=1次
    //2 调用字符串的方法判断
    boolean b=s.matches(regex);
    System.out.println(s+"::是否匹配规则:(叠词)::"+b);
}
//4判断字符串是不是叠词:格式如:aaaa1bb 前面是字母叠词  后面是字母叠词 中间是一个数字
public static void test05(String s){
    //1 定义字符串表示正则规则:
    String regex="([a-zA-Z])\\1+[0-9]([a-zA-Z])\\2+";//()表示封装:组
    //2 调用字符串的方法判断
    boolean b=s.matches(regex);
    System.out.println(s+"::是否匹配规则:(特殊叠词)::"+b);
}

4.2 split方法

//String[] split(String regex)   :使用与参数正则表达式匹配的所有子串 切割当前字符串 
public static void main(String[] args) {
    while(true){
        System.out.println("请输入字符串!");
        String line=new Scanner(System.in).nextLine();
        test02(line);
    }
}
//1 :abc12dfg87ouy09yt6  使用非数字字符进行切割
public static void test01(String s){
    //1 定义字符串表示正则规则
    String regex="\\D+";
    //2 调用字符串的方法判断
    String[] arr=s.split(regex);
    System.out.println(s+"::切割:(使用非数字字符进行切割)::"+Arrays.toString(arr));
}
//2:使用点切割
public static void test02(String s){
    String[] arr=s.split(".");//使用任意字符切割
    System.out.println(s+"::切割:(使用点切割)::"+Arrays.toString(arr));
    arr=s.split("\\.");
    System.out.println(s+"::切割:(使用点切割)::"+Arrays.toString(arr));
}

4.3 replaceAll方法

//String[] split(String regex)   :使用与参数正则表达式匹配的所有子串 切割当前字符串 
public static void main(String[] args) {
    while(true){
        System.out.println("请输入字符串!");
        String line=new Scanner(System.in).nextLine();
        test03(line);
    }
}
//1 :abc12dfg87ouy09yt6   获取其中的所有数字字符
public static void test01(String s){
    //2 调用字符串的方法判断
    String ss=s.replaceAll("\\D+", "");//把所有的非数字字符用空字符串替换
    System.out.println(s+"::替换::"+ss);
}
//2 :字符串转换:去除叠词:  111aaaabbb222cdeee111--->1ab2cde1
public static void test02(String s){
    //2 调用字符串的方法判断
    String ss=s.replaceAll("(.)\\1+", "$1");//replaceAll方法的第二个参数中的$1 表示第一个参数的第一组的内容
    System.out.println(s+"::替换::"+ss);
}
//3 :字符串转换:去除叠词:  1aa2a3bbb465dddd666ccca--->1a2a3b465d666ccca
// 数字 叠词字母 数字---替换为 数字 字母 数字   1bbbb2  ---1b2
public static void test03(String s){
    //2 调用字符串的方法判断
    String ss=s.replaceAll("([0-9])([a-zA-Z])\\2+([0-9])", "$1$2$3");//replaceAll方法的第二个参数中的$1 表示第一个参数的第一组的内容
    System.out.println(s+"::替换::"+ss);
}

5 js中使用正则表达式

5.1 注意事项

  • js中的正则表达式规则和java中完全相同
  • js中创建正则表达式两种方式
var regex1=/1[3-9][0-9]{9}/i;   //i表示不区分大小写
var regex2=new RegExp("1[3-9][0-9]{9}",i);
  • js中可以使用正则的方法是:正则表达式对象的 boolean test(str);参数是要被判断的字符串对象

5.2 案例1

<form  action="#"  method="get">
    <table>
        <tr>
            <th>用户名:</th>
            <td>
                <input  type="text" name="uname" placeholder="用户名必须是2-4个汉字"/>
                <span id="span_uname"> </span>
            </td>
        </tr>
        <tr>
            <th>密码:</th>
            <td>
                <input  type="text" name="upwd" placeholder="密码必须是6位数字"/>
                <span id="span_upwd"> </span>
            </td>
        </tr>
        <tr>
            <th>重复密码:</th>
            <td>
                <input  type="text" name="reupwd" placeholder="必须和密码一致"/>
                <span id="span_reupwd"> </span>
            </td>
        </tr>
        <tr>
            <th>性别:</th>
            <td>
                男:<input  type="radio" name="usex" value="男"/> |
                女:<input  type="radio" name="usex" value="女"/>
                <span id="span_usex"> </span>
            </td>
        </tr>
        <tr>
            <th>爱好:</th>
            <td>
                篮球:<input  type="checkbox" name="uenjoy" value="篮球"/> |
                足球:<input  type="checkbox" name="uenjoy" value="足球"/> |
                排球:<input  type="checkbox" name="uenjoy" value="排球"/> |
                台球:<input  type="checkbox" name="uenjoy" value="台球"/> |
                铅球:<input  type="checkbox" name="uenjoy" value="铅球"/> 
                <span id="span_uenjoy"> </span>
            </td>
        </tr>
        <tr>
            <th>邮箱:</th>
            <td>
                <input  type="text" name="umail" placeholder="邮箱格式必须正确"/>
                <span id="span_umail"> </span>
            </td>
        </tr>
        <tr>
            <th colspan="2"><input type="submit" value="提交"/></th>
        </tr>
    </table>
</form>

<script type="text/javascript">
    var bname=false;
    $(function(){
        $("input[name='uname']").bind("blur",pdUname);

    });
    //判断用户名是否正确
    function pdUname(){
        var uname=$("input[name='uname']").val();
        var regex=/^[\u4e00-\u9fa5]{2,4}$/;
        bname=regex.test(uname);
        if(bname){
            $("#span_uname").html("用户名可用!".fontcolor("blue").bold());
        }else{
            $("#span_uname").html("用户名必须是2-4个汉字!".fontcolor("red").bold());
        }
    }
</script>
<script type="text/javascript">
    var bpwd=false;
    $(function(){
        $("input[name='upwd']").bind("blur",pdUpwd);

    });
    //判断密码格式是否正确
    function pdUpwd(){
        var upwd=$("input[name='upwd']").val();
        var regex=/^\d{6}$/;
        bpwd=regex.test(upwd);
        if(bpwd){
            $("#span_upwd").html("密码可用!".fontcolor("blue").bold());
        }else{
            $("#span_upwd").html("密码必须是6个数字!".fontcolor("red").bold());
        }
    }
</script>
<script type="text/javascript">
    var brepwd=false;
    $(function(){
        $("input[name='reupwd']").bind("blur",pdReupwd);
    });
    //判断密码格式是否正确
    function pdReupwd(){
        //判断密码是否正确
        pdUpwd();
        if(!bpwd){
            brepwd=false;
            $("#span_reupwd").html("密码格式错误!".fontcolor("red").bold());
            return;
        }
        //判断密码和重复密码是否一致
        var reupwd=$("input[name='reupwd']").val();
        var upwd=$("input[name='upwd']").val();
        brepwd=reupwd==upwd;
        if(brepwd){
            $("#span_reupwd").html("重复密码正确!".fontcolor("blue").bold());
        }else{
            $("#span_reupwd").html("重复密码不正确!".fontcolor("red").bold());
        }
    }
</script>
<script type="text/javascript">
    var bsex=false;
    //判断性别是否选择
    function pdUsex(){
        var usex=$("input[name='usex']:checked").val();
        bsex=usex;
        if(bsex){
            $("#span_usex").html("性别已选!".fontcolor("blue").bold());
        }else{
            $("#span_usex").html("性别必须选择!".fontcolor("red").bold());
        }
    }
</script>
<script type="text/javascript">
    var benjoy=false;
    //判断爱好是否选择:至少两个
    function pdUenjoy(){
        var uenjoyColl=$("input[name='uenjoy']:checked");
        benjoy=uenjoyColl.length>=2;
        if(benjoy){
            $("#span_uenjoy").html("爱好已选择!".fontcolor("blue").bold());
        }else{
            $("#span_uenjoy").html("爱好至少两个!".fontcolor("red").bold());
        }
    }
</script>
<script type="text/javascript">
    var bmail=false;
    $(function(){
        $("input[name='umail']").bind("blur",pdUmail);
    });
    //判断邮箱是否正确
    function pdUmail(){
        var umail=$("input[name='umail']").val();
        var regex=/^.+@.+(\.[a-z]+)+$/i;
        bmail=regex.test(umail);
        if(bmail){
            $("#span_umail").html("邮箱格式正确!".fontcolor("blue").bold());
        }else{
            $("#span_umail").html("邮箱格式错误!".fontcolor("red").bold());
        }
    }
</script>
<script type="text/javascript">
    $(function(){
        $("form:first").bind("submit",function(){
            pdUname();
            pdUpwd();
            pdReupwd();
            pdUsex();
            pdUenjoy();
            pdUmail();
            return bmail && benjoy && bsex && brepwd && bpwd && bname;
        });
    });
</script>

5.3 案例2:方法复用

<form  action="#"  method="get">
    <table>
        <tr>
            <th>用户名:</th>
            <td>
                <input  type="text" name="uname" placeholder="用户名必须是2-4个汉字"/>
                <span id="span_uname"> </span>
            </td>
        </tr>
        <tr>
            <th>密码:</th>
            <td>
                <input  type="text" name="upwd" placeholder="密码必须是6位数字"/>
                <span id="span_upwd"> </span>
            </td>
        </tr>
        <tr>
            <th>重复密码:</th>
            <td>
                <input  type="text" name="reupwd" placeholder="必须和密码一致"/>
                <span id="span_reupwd"> </span>
            </td>
        </tr>
        <tr>
            <th>性别:</th>
            <td>
                男:<input  type="radio" name="usex" value="男"/> |
                女:<input  type="radio" name="usex" value="女"/>
                <span id="span_usex"> </span>
            </td>
        </tr>
        <tr>
            <th>爱好:</th>
            <td>
                篮球:<input  type="checkbox" name="uenjoy" value="篮球"/> |
                足球:<input  type="checkbox" name="uenjoy" value="足球"/> |
                排球:<input  type="checkbox" name="uenjoy" value="排球"/> |
                台球:<input  type="checkbox" name="uenjoy" value="台球"/> |
                铅球:<input  type="checkbox" name="uenjoy" value="铅球"/> 
                <span id="span_uenjoy"> </span>
            </td>
        </tr>
        <tr>
            <th>邮箱:</th>
            <td>
                <input  type="text" name="umail" placeholder="邮箱格式必须正确"/>
                <span id="span_umail"> </span>
            </td>
        </tr>
        <tr>
            <th colspan="2"><input type="submit" value="提交"/></th>
        </tr>
    </table>
</form>

<script type="text/javascript">
    var bname=false;
    $(function(){
        $("input[name='uname']").bind("blur",pdUname);
    });
    function pdUname(){
        bname=pd($("input[name='uname']"),/^[\u4e00-\u9fa5]{2,4}$/i,$("#span_uname"),"用户名必须是2-4个汉字!","用户名可用!");
    }
</script>
<script type="text/javascript">
    var bpwd=false;
    $(function(){
        $("input[name='upwd']").bind("blur",pdUpwd);
    });
    function pdUpwd(){
        bpwd=pd($("input[name='upwd']"),/^\d{6}$/i,$("#span_upwd"),"密码必须是6个数字!","密码可用!");
    }
</script>
<script type="text/javascript">
    var brepwd=false;
    $(function(){
        $("input[name='reupwd']").bind("blur",pdReupwd);
    });
    //判断密码格式是否正确
    function pdReupwd(){
        //判断密码是否正确
        pdUpwd();
        if(!bpwd){
            brepwd=false;
            $("#span_reupwd").html("密码格式错误!".fontcolor("red").bold());
            return;
        }
        //判断密码和重复密码是否一致
        var reupwd=$("input[name='reupwd']").val();
        var upwd=$("input[name='upwd']").val();
        brepwd=reupwd==upwd;
        if(brepwd){
            $("#span_reupwd").html("重复密码正确!".fontcolor("blue").bold());
        }else{
            $("#span_reupwd").html("重复密码不正确!".fontcolor("red").bold());
        }
    }
</script>
<script type="text/javascript">
    var bsex=false;
    //判断性别是否选择
    function pdUsex(){
        var usex=$("input[name='usex']:checked").val();
        bsex=usex;
        if(bsex){
            $("#span_usex").html("性别已选!".fontcolor("blue").bold());
        }else{
            $("#span_usex").html("性别必须选择!".fontcolor("red").bold());
        }
    }
</script>
<script type="text/javascript">
    var benjoy=false;
    //判断爱好是否选择:至少两个
    function pdUenjoy(){
        var uenjoyColl=$("input[name='uenjoy']:checked");
        benjoy=uenjoyColl.length>=2;
        if(benjoy){
            $("#span_uenjoy").html("爱好已选择!".fontcolor("blue").bold());
        }else{
            $("#span_uenjoy").html("爱好至少两个!".fontcolor("red").bold());
        }
    }
</script>
<script type="text/javascript">
    var bmail=false;
    $(function(){
        $("input[name='umail']").bind("blur",pdUmail);
    });
    function pdUmail(){
        bmail=pd($("input[name='umail']"),/^.+@.+(\.[a-z]+)+$/i,$("#span_umail"),"邮箱格式错误!","邮箱格式正确!");
    }
</script>
<script type="text/javascript">
    $(function(){
        $("form:first").bind("submit",function(){
            pdUname();
            pdUpwd();
            pdReupwd();
            pdUsex();
            pdUenjoy();
            pdUmail();
            return bmail && benjoy && bsex && brepwd && bpwd && bname;
        });
    });
</script>

<script type="text/javascript">
    function pd($node,regex,$span,errorMessage,successMessage){
        var b=regex.test($node.val());
        if(b){
            $span.html(successMessage.fontcolor("blue").bold());
        }else{
            $span.html(errorMessage.fontcolor("red").bold());
        }
        return b;
    }
</script>
上一篇:mysql每日一题0809--每行包含某个特定数据或者字符 like regex like length


下一篇:boost::regex模块用于测试特定于语言环境的表达式的帮助程序类