1 概念
正则表达式:regex
给字符串定义正确规则的字符串表达式
api:参考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>