正则表达式的初步理解
1、正则表达式的概述
正则表达式的定义:是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符。其实就是一种规则。
正则表达式的作用:比如注册邮箱,邮箱有用户名和密码,一半会对其限制长度,这个限制长度的事情就是正则表达式做的。
package com.hwadee;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ValidateQQ {
/*
* 需求:校验QQ号码
* 1、要求必须是5-15位数字
* 2、0不能开头
* 3、必须都是数字
*/
public static void main(String[] args) {
System.out.println(checkQQ("0123456"));
System.out.println(checkQQ("a1b654"));
System.out.println(checkQQ("123456"));
System.out.println(checkQQ("15648795123215498941"));
System.out.println("-----------------------------------------");
//正则表达式实现
String regex="[1-9]\\d{4,14}";
System.out.println("125468456".matches(regex));
System.out.println("023156484".matches(regex));
System.out.println("as54562sw".matches(regex));
System.out.println("546854895621326546854".matches(regex));
}
//非正则表达式实现
public static boolean checkQQ(String qq) {
boolean flag=true;//如果校验QQ不符合要求就把flag置为false,如果符合要求就直接返回
if (qq.length()>=5&&qq.length()<=15) {
if (!qq.startsWith("0")) {
char[] arr=qq.toCharArray();//将字符串转换为字符数组
for(int i=0;i<arr.length;i++) {
char ch=arr[i];//记录每一个字符
if(!(ch>='0'&&ch<='9')) {
flag=false;//不是数字
break;
}
}
}else {
flag=false;//以0开头,不符合qq标准
}
}else {
flag=false;//长度不符合
}
return flag;
}
}
2、正则表达式的字符类
package com.hwadee;
public class RegexCharacter {
/*
* [abc] a或者b或c(即abc中的任意一个)(简单类)
* [^abc] 除了 a、b 或 c以外的任何字符,(否定)
* [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围) ,即表示了所有
* [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
* [a-z&&[def]] d、e 或 f(交集)
* [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
* [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
*/
public static void main(String[] args) {
test1();
test2();
test3();
test4();
test5();
test6();
String regex="[a-z&&[^m-p]]";
System.out.println("m".matches(regex));
System.out.println("a".matches(regex));
System.out.println("z".matches(regex));
System.out.println("n".matches(regex));
}
public static void test1() {
String regex="[abc]";//[]代表单个字符
System.out.println("a".matches(regex));
System.out.println("d".matches(regex));
}
private static void test2() {
String regex="[^abc]";
System.out.println("a".matches(regex));
System.out.println("1".matches(regex));
System.out.println("10".matches(regex));//10代表1字符和0字符,不是单个字符
}
public static void test3() {
String regex="[a-zA-Z]";
System.out.println("a".matches(regex));
System.out.println("1".matches(regex));
}
public static void test4() {
String regex="[a-d[m-p]]";
System.out.println("a".matches(regex));
System.out.println("m".matches(regex));
System.out.println("n".matches(regex));
}
public static void test5() {
String regex="[a-z&&[def]]";//取交集
System.out.println("a".matches(regex));
System.out.println("d".matches(regex));
}
public static void test6() {
String regex="[a-z&&[^bc]]";
System.out.println("a".matches(regex));
System.out.println("b".matches(regex));
System.out.println("1".matches(regex));
}
}
3、正则表达式的预定义字符类
package com.hwadee;
public class RegexPreCharacter {
/*
* .任何字符,如果想表示.字符本身用\.
* \d:数字[0-9]
* \D:非数字[^0-9]
* \s 空白字符:[ \t\n\x0B\f\r]
* \S 非空白字符:[^\s]
* \w 单词字符:[a-zA-Z_0-9]
* \W 非单词字符:[^\w]
*/
public static void main(String[] args) {
test1();
test2();
test3();
test4();
test5();
test6();
String regex="\\W";
System.out.println("a".matches(regex));
System.out.println("z".matches(regex));
System.out.println("_".matches(regex));
System.out.println("%".matches(regex));
}
public static void test1() {
String regex="..";
System.out.println("a".matches(regex));
System.out.println("ab".matches(regex));
}
public static void test2() {
String regex="\\d";//代表转义字符,如果想表示\d的话,需要\\d
System.out.println("0".matches(regex));
System.out.println("a".matches(regex));
System.out.println("9".matches(regex));
}
public static void test3() {
String regex="\\D";
System.out.println("0".matches(regex));
System.out.println("a".matches(regex));
System.out.println("9".matches(regex));
}
public static void test4() {
String regex="\\s";
System.out.println(" ".matches(regex));
System.out.println(" ".matches(regex));//一个tab键
System.out.println(" ".matches(regex));//4个空格
}
public static void test5() {
String regex="\\S";
System.out.println(" ".matches(regex));
System.out.println(" ".matches(regex));
System.out.println("a".matches(regex));
}
public static void test6() {
String regex="\\w";
System.out.println("a".matches(regex));
System.out.println("z".matches(regex));
System.out.println("_".matches(regex));
System.out.println("%".matches(regex));
}
}
4、正则表达式的分割功能
package com.hwadee;
//正则表达式的分割功能
public class RegexSplit {
public static void main(String[] args) {
String s="长亭外.古道边.芳草碧连天";
String[] arr =s.split("\\.");//通过正则表达式切割字符串
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
}
package com.hwadee;
import java.util.Scanner;
/*
* 分割功能
* String类的public String[] split(String regex)
* 根据给定正则表达式的匹配拆分此字符串。
*
* 举例:
*
* 搜索好友
* 性别:女
* 范围:"18-24"
*
* age>=18 && age<=24
*/
public class RegexDemo1 {
public static void main(String[] args) {
//定义一个年龄搜索范围
String ages = "18-24";
//定义规则
String regex = "-";
//调用方法
String[] strArray = ages.split(regex);
// //遍历
// for(int x=0; x<strArray.length; x++){
// System.out.println(strArray[x]);
// }
//如何得到int类型的呢?
int startAge = Integer.parseInt(strArray[0]);
int endAge = Integer.parseInt(strArray[1]);
//键盘录入年龄
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
if(age>=startAge && age<=endAge) {
System.out.println("你就是我想找的");
}else {
System.out.println("滚");
}
}
}
5、正则表达式的替换功能
package com.hwadee;
//正则表达式的替换功能
public class RegexReplace {
public static void main(String[] args) {
String s ="ni111hao56846mingtian";
String regex="\\d";//\\d代表的是任意数字
String s2=s.replaceAll(regex, "*");
System.err.println(s2);
}
}
6、正则表达式的分组功能
package com.hwadee;
import java.awt.Frame;
//正则表达式的分组功能
public class RegexGroup {
public static void main(String[] args) {
test1();
test2();
String s="我我我...我...我...想..想想想.......学学...学..编.编.编编...程.程.程....程";
String s2=s.replaceAll("\\.+", "");
System.err.println(s2);
String s3=s2.replaceAll("(.)\\1+", "$1");//$1代表第一组中的内容
System.out.println(s3);
}
public static void test1() {
String regex2="(..)\\1";
System.err.println("高兴高兴".matches(regex2));
System.err.println("快快乐乐".matches(regex2));
}
public static void test2() {
String s="sdaawdasdasdwd";
String regex="(.)\\1+";//+代表第一组出现一次到多次
String[] arr=s.split(regex);
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
}
7、正则表达式的获取功能
package com.hwadee;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* Pattern和Matcher类的使用
*
* 模式和匹配器的基本使用顺序
*/
public class RegexDemo2 {
public static void main(String[] args) {
// 模式和匹配器的典型调用顺序
// 把正则表达式编译成模式对象
Pattern p = Pattern.compile("a*b");
// 通过模式对象得到匹配器对象,这个时候需要的是被匹配的字符串
Matcher m = p.matcher("aaaaab");
// 调用匹配器对象的功能
boolean b = m.matches();
System.out.println(b);
//也可以直接如下操作
String s = "aaaaab";
String regex = "a*b";
boolean bb = s.matches(regex);
System.out.println(bb);
}
}
8、邮箱规则练习
package com.hwadee;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//用正则表达式规定邮箱
public class DemoPattern {
public static void main(String[] args) {
test1();
}
public static void test1() {
String mailBox="";
Scanner scanner=new Scanner(System.in);
System.out.println("请输入你的邮箱:");
mailBox = scanner.nextLine();
String regex="\\w{5,10}@\\w{2,6}(\\.\\w{2,3})+";
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(mailBox);
boolean b=m.matches();
System.out.println(mailBox+" 的验证结果是:"+b);
}
}