正则表达式:
正则表达式可以用字符串来描述规则,并用来匹配字符串。它跟语言无关,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)";
验证身份证号和邮箱:
//验证身份证 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、测试效果
失去焦点触发
点击注册按钮触发,说实话可以把失焦触发删掉。在提交按钮的时候再触发