正则表达式作用:1.校验字符串是否满足规则;2.在一段文本中查找满足要求的内容
正则表达式:
字符类:
[abc]---->只能是a或b或c
[^abc]----->除了a,b,c之外的任何字符
[a-zA-Z]----->a到z,A到Z,包括(范围)
[a-d[m-p]]------->a到d,或m到p
[a-z&&[def]]----->a-z和def的交集:为d,e,f
[a-z&&[^bc]]----->a-z和非bc的交集(等同于[ad-z])
[a-z&&&[^m-p]]---->a到z除了m到p的交集(等同于[a-lq-z])
预定义字符:(只匹配一个字符)
. ----->任何字符
\d----->一个数字:[0-9]
\D----->非数字:[^0-9]
\s----->空白字符:[\t\n\x08\f\r]
\S------>非空白字符:[^\s]
\w------>[a-zA-Z_0-9]:字母、数字、下划线
\W------>[^\w]:一个非单词字符
注意:\ 转义字符:改变后面那个字符原本的含义
例如:" 在Java中表示字符串的开头或者结尾,所以如果想打印一个双引号"
System.out.println("\"");
数量词:
X?------->X,一次或0次
X*-------->X,零次或多次
X+-------->X,一次或多次
X{n}-------->X,正好n次
X{n,}-------->X,至少n次
X{n,m}--------->X,至少n但不超过m次
练习1:校验一个QQ号是否正确
6-20位之内,0不能在开头,必须全部是数字
方法1:(以前学习的方法)
package a07regexdemo;
public class RegexDemo1 {
public static void main(String[] args) {
String qq="1234567890";
System.out.println(checkQQ(qq));//true
}
public static boolean checkQQ(String qq){
//核心思想:
//先把异常数据进行过滤,下面的就是满足要求的数据了
int len=qq.length();
if(len<6||len>20){
return false;
}
//0不能开头
if(qq.startsWith("0")){
return false;
}
//必须全部都是数字
for (int i = 0; i < qq.length(); i++) {
char c=qq.charAt(i);
if(c<'0'||c>'9'){
return false;
}
}
return true;
}
}
运行结果:
方法2:正则表达式方法:
package a07regexdemo;
public class RegexDemo1 {
public static void main(String[] args) {
String qq="1234567890";
System.out.println(qq.matches("[1-9]\\d{5,19}"));//true
}
}
练习2:
用正则表达式验证用户输入的手机号是否满足要求
用正则表达式验证用户输入的邮箱号是否满足要求
用正则表达式验证用户输入的座机号是否满足要求
package a07regexdemo;
public class RegexDemo2 {
public static void main(String[] args) {
//手机号码的验证:
//心得:拿着一个正确的数据从左到右依次去写
//13112345678
//分成三部分:
//第一部分:1表示手机号码只能以1开头
//第二部分:[3-9]表示手机号码第二位只能是3-9之间的
//第三部分:\\d{9}表示任意数字只能出现9次,也只能出现9次
String regex1="1[3-9]\\d{9}";
System.out.println("13112345678".matches(regex1));//true
System.out.println("12345677777".matches(regex1));//false
System.out.println("13712345677".matches(regex1));//true
System.out.println("13111288888".matches(regex1));//true
System.out.println("----------------------");
//座机号码的验证
//020-2324242,02122442,027-42424,0712-3242434
//思路:在书写座机号正则的时候需要把正确的数据分为三部分
//1.区号:0\\d{2,3},区号有可能2位,有可能三位
//0:表示区号一定是以0开头
//0\\d{2,3}:表示表示区号从第二位开始可以是任意的数字,可以出现2到3次
//2.-:?表示次数可以是0次或一次
//3.号码:号码的第一位也不能是0开头,从第二位开始可以是任意的数字,号码的总长度:5-10位
//
//
String regex2="0\\d{2,3}-?[1-9]\\d{4,9}";
System.out.println("020-2324242".matches(regex2));//true
System.out.println("02122442".matches(regex2));//true
System.out.println("027-42424".matches(regex2));//true
System.out.println("0712-3242434".matches(regex2));//true
System.out.println("--------------------");
//邮箱号码
//3232323@qq.com zhangsan@itcast.cnn dlei0009@163.com dlei0009@pci.com.cn
//思路:在书写邮箱号码正则的时候需要把正确的数据分为三部分
//第一部分:@的左边
// \\w+表示a-z A-Z 0-9 _至少出现一次就可以了
//第二部分:@ 只能出现一次
//第三部分:.左边 . .右边
//3.1:.左边[\\w&&[^_]]{2,6} ----->任意的字母加数字总共出现6次(此时不能出现下划线)
//3.2:.转义.所以是\\.
//3.3:大写字母,小写字母都可以,只能出现2-3次 [a-zA-Z]{2,3}
//可以把3.2,3.3看成一组,这一组可以出现一次到两次
String regex3="\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
System.out.println("3232323@qq.com".matches(regex3));//true
System.out.println("zhangsan@itcast.cnn".matches(regex3));//true
System.out.println("dlei0009@163.com".matches(regex3));//true
System.out.println("dlei0009@pci.com.cn".matches(regex3));//true
//24小时的正则表达式
String regex4="([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d";
//优化24小时的正则表达式
String regex5="([01]\\d|2[0-3])(:[0-5]\\d){2}";
}
}
运行结果:
一般用不到正则,只需要百度一个类似的改成我们需要的就可以了
有一个插件:File点Settings按照1,2,3,4步骤依次点击就可以了,里面是大多数正则表达式