22-05-16 西安 javaweb(02) 正则表达式regex

正则表达式:

正则表达式可以用字符串来描述规则,并用来匹配字符串。它跟语言无关,java和js都有正则,具体的语法是一模一样的。


java中的正则表达式

一个正则表达式就是一个描述规则的字符串

Java字符串用\\表示\

1、java中正则匹配的3种方式

方式一:拿字符串去匹配正则表达式,字符串的matches()方法

    public static void main(String[] args) {
        //Java中俩个\\相当于js\
        String reg="^\\w{6,15}$";
        String username="admin123";
        //拿字符串去匹配正则表达式,返回true/false
        System.out.println(username.matches(reg));
    }

方式二:调用  java.util.regex.Pattern 的方法

 boolean matches(String regex, CharSequence input)
    public static void main(String[] args) {
        //Java中俩个\\相当于js\
        String reg="^\\w{6,15}$";
        String username="admin123";
        //java.util.regex.Pattern 也是拿字符串去匹配正则表达式
        System.out.println(Pattern.matches(reg,username));
    }

方式三:其实方式一和方式二也是封装了方式三的代码而已

    public static void main(String[] args) {
        String reg="^\\w{6,15}$";
        String username="admin23";
        Pattern r = Pattern.compile(reg);
        Matcher m = r.matcher(username);
        System.out.println(m.matches());
    }

1、正则表达式是用于验证某个字符串是否符合规则的字符串 ,还有查找、替换功能
2、js正则表达式的格式: /规则表达式/


2、Matcher对象分组提取子串

正则表达式用(...)分组可以通过Matcher对象快速提取子串:

group(0)表示匹配的整个字符串; group(1)表示第1个子串,group(2)表示第2个子串,以此类推。

自己写的,有点小傲娇

    public static void main(String[] args) {
        //用(...)先把要提取的规则分组
        Pattern p = Pattern.compile("([0-2]\\d):([0-5]\\d):([0-5]\\d)");
        Matcher m = p.matcher("21:19:20");
        if (m.matches()) {
            //提取时分秒
            String hour = m.group(1);//表示第一个子串
            String minutes = m.group(2);//表示第二个子串
            String seconds = m.group(3);//表示第三子串

            System.out.println(hour);//21
            System.out.println(minutes);//19
            System.out.println(seconds);//20
        } else {
            System.out.println("匹配失败!");
        }
    }

运行结果:


正则表达式语法

1、模糊匹配和精确匹配

用正则表达式进行多行匹配时,我们用^表示开头,$表示结尾
做验证功能:精确匹配 /^$/,例如:

开始:/^a/,必须用a开头
结束:/a$/,必须用a结尾

2、预定义和自定义字符集

1、字符集:验证字符串某个位置能够出现的字符,一个字符集只能匹配一个字符(一位)

预定义字符集正则表达式中定义好的字符集

 . --> 匹配任意一个字符(换行符除外)且仅限一个字符
\w --> 匹配一个字母、数字或下划线
\d -->仅限单个数字字符
\s -->匹配空白符(包括空格和tab符)

\d可以匹配一个数字,而\D则匹配一个非数字

自定义字符集

1、需要将当前位置能够出现的字符写在[] 中
2、若当前位置出现的字符具有连续性,用-表示其连续性 [A-Za-z0-9]  // 注意不能有空格
3、若当前位置只能出现某个固定的字符,只需要将此字符写在当前位置即可:如[a], 此时[]可以不写

如:  [ABC] 可以匹配A,B,C任意字符

[...]还有一种排除法,即不包含指定范围的字符。

[^A-F]    指定范围外的任意字符    匹配“非A~F”


3、重复次数和其他

?: 重复0次或一次    相当于{0,1}
+:重复至少一次    相当于{1,}
*:重复任意次        相当于{0, }


{n}:必须重复n次
{n,} 至少重复n次
{n,m}:重复n到m次 

转义 \[反斜线]
如去匹配邮箱的 .         用\.


或  |
当前整体能出现的情况 而不同于[]中表示的是当前字符的或,如邮箱后缀   (com|cn|net)

//把公共部分提出来,然后用(...)把子规则括起来
String re = "learn\s(java|php|go)";

正则表达式在线测试工具-rbtree.cn

 验证身份证号和邮箱:

    //验证身份证
    var reg_card = /^[1-9]\d{16}[0-9X]$/;
    //验证邮箱地址,1991051251@qq.com
    var reg_email = /^\w+@\w+\.(com|cn|net)$/;


JS表单验证

下面用纯js代码编写,下一篇会用vue来写呢

1、页面效果与验证需求

页面效果如下:

表单验证需求:

  • 当表单项失去焦点时,判断表单项的内容是否符合规则
  • 若不符合规则,则在其后的span标签中展示错误信息,并阻止表单提交 若全部符合规则,则清空错误信息,并提交表单

2、regex表单验证

表单事件最后一定要在提交按钮的时候重新验证一遍

return false  //在函数里,阻止标签的默认行为,结束当前的函数

js验证:正则表达式.test(字符串)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="success.html" method="post">
    用户名:<input type="text" name="username"><span id="error_username"></span><br>
    密码:<input type="password" name="password"><span id="error_password"></span><br>
    <input type="submit" value="注册" id="submitBtn">
</form>

<script type="text/javascript">
    /**
     * 当表单项失去焦点时,判断表单项的内容是否符合规则
     * 若不符合规则,则在其后的span标签中展示错误信息,并阻止表单提交
     * 若全部符合规则,则清空错误信息,并提交表单
     * 注意:一定要在提交表单时,对所有的表单项重新验证
     */
    var usernameElement = document.getElementsByName("username")[0];
    usernameElement.onblur = function () {
        //验证用户名为6-15位的数字字母下划线
        var reg_username = /^\w{6,15}$/;
        var username = usernameElement.value;
        if(!reg_username.test(username)){
            document.getElementById("error_username").innerHTML = "用户名为6-15位的数字字母下划线";
        }else{
            document.getElementById("error_username").innerHTML = "";
        }
    };

    var passwordElement = document.getElementsByName("password")[0];
    passwordElement.onblur = function () {
        //验证密码为6-15位的数字字母下划线,不能以数字开头
        var reg_password = /^[a-zA-Z_]\w{5,14}$/;
        var password = passwordElement.value;
        if(!reg_password.test(password)){
            document.getElementById("error_password").innerHTML = "密码为6-15位的数字字母下划线,不能以数字开头";
        }else{
            document.getElementById("error_password").innerHTML = "";
        }
    };

///提交表单时,对所有的表单项重新验证//

    var submitBtn = document.getElementById("submitBtn");
    submitBtn.onclick = function () {
        var flag = true;
        //验证用户名为6-15位的数字字母下划线
        var reg_username = /^\w{6,15}$/;
        var username = usernameElement.value;
        if(!reg_username.test(username)){
            document.getElementById("error_username").innerHTML = "用户名为6-15位的数字字母下划线";
            flag = false;
        }else{
            document.getElementById("error_username").innerHTML = "";
        }

        //验证密码为6-15位的数字字母下划线,不能以数字开头
        var reg_password = /^[a-zA-Z_]\w{5,14}$/;
        var password = passwordElement.value;
        if(!reg_password.test(password)){
            document.getElementById("error_password").innerHTML = "密码为6-15位的数字字母下划线,不能以数字开头";
            flag = false;
        }else{
            document.getElementById("error_password").innerHTML = "";
        }

        return flag;
    };
</script>
</body>
</html>

3、测试效果

失去焦点触发

 点击注册按钮触发,说实话可以把失焦触发删掉。在提交按钮的时候再触发

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值