一、正则表达式概述
1、正则表达式用于操作字符数据
2、通过举例初步了解正则
* 定义一个功能对qq号进行校验
* 需求:长度5~15位,只能是数字,开头不能为0
----->一般的写法
packagecom.JavaZhengZe;/*** @Author wufq
* @Date 2020/9/16 11:06
*
* 正则表达式
*
* 正则表达式用于操作字符串数据*/
public classRegexDemo {public static voidmain(String[] args){
String qq= "45668676";
checkQQ(qq);
}/** 定义一个功能对qq号进行校验
* 需求:长度5~15位,只能是数字,开头不能为0
**/
public static voidcheckQQ(String qq){int len =qq.length();if(len>=5&&len<=15){if(!qq.startsWith("0")){try{long l =Long.parseLong(qq);
System.out.println(qq+" 正确的!");
}catch(NumberFormatException e) {
System.out.println(qq+":含有非法数字!");
}
}else{
System.out.println(qq+" qq号开头不能为0");
}
}else{
System.out.println("长度只能为5~15位");
}
}
}
------>利用正则的写法
String类内有一个matches方法
boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式。
packagecom.JavaZhengZe;/*** @Author wufq
* @Date 2020/9/16 11:06
*
* 正则表达式
*
* 正则表达式用于操作字符串数据*/
public classRegexDemo {public static voidmain(String[] args){
String qq= "45668676";
String regex= "[1-9][0-9]{4,14}";//正则表达式
boolean b =qq.matches(regex);
System.out.println(qq+"::"+b);
}/** 定义一个功能对qq号进行校验
* 需求:长度5~15位,只能是数字,开头不能为0
**/}
通过以上两段代码的比较发现:通过一些特定的符号来体现,所以我们为了掌握正则表达式。必须要学习一些符号。
虽然简化了,但是阅读性差。
二、常见的规则
\\ 反斜线字符
\t 制表符
\r 回车符
\n 新行符
\f 换页符
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
. 任何字符(与行结束符可能匹配也可能不匹配)
* 表示匹配0-无穷
+ 表示匹配1-无穷
? 表示放在其他字符后面表示前面的字符可以有,也可以没有,或者放在*、+后面表示匹配尽可能少的字符
\d 数字:[0-9]
\D 非数字: [^0-9]
(X) X,作为捕获组
\b:表示字母数字与非字母数字的边界, 非字母数字与字母数字的边界。
\B:表示字母数字与(非非)字母数字的边界,非字母数字与非字母数字的边界。
三、正则常见的功能
1、正则表达式对字符串的常见操作
1)匹配
其实使用的就是String类中的matches方法
2)切割
其实使用的就是String类中的split方法
3)替换
4)获取
packagecom.JavaZhengZe;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/*** @Author wufq
* @Date 2020/9/17 10:40
*
* 正则表达式的常见功能
* 1、匹配
其实就是使用String类中的matches方法
* 2、切割
其实就是使用String类中的split方法
* 3、替换
其实使用的就是string类中的replaceAll()方法
* 4、获取
* //将正则规则进行对象的封装
* Pattern p = Pattern.compile("a*b")
* //通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher
* Matcher m = p.matcher("aaaaab");
* //通过Matcher匹配器对象的方法对字符串进行操作
* boolean b = m.matches();*/
public classRegexDemo01 {public static voidmain(String[] args){//functionDemo_1();//functionDemo_2();//functionDemo_3();
functionDemo_4();
}/*获取*/
public static voidfunctionDemo_4() {
String str= "da jia hao,ming tian bu shang ban";
String regex= "\\b[a-z]{3}\\b"; //---> [a-z]{3}:a-z三位数 \b:表示字母数字与非字母数字的边界,非字母数字与字母数字的边界。
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(str);
System.out.println(str);//查找匹配
while(m.find()){
System.out.println(m.group());
System.out.println(m.start()+"::"+m.end());
}
}/*替换*/
public static voidfunctionDemo_3() {
String str= "zhangsan###lisi----zhaoletttwangwu";
str= str.replaceAll("(.)\\1+","###"); //所有的重复的--- ttt替换成###//把--- ttt替换成一个- 一个t
str = str.replaceAll("(.)\\1+","$1");//执行结果:zhangsan#lisi-zhaoletwangwu
String tel= "15868761111";//转换成158****1111
tel= tel.replaceAll("(\\d{3})(\\d{4})(\\d{4})","$1****$3"); //分成三个组,(\d{3})是一个组,后面两个是两个组,然后替换时用$1 $3确定
System.out.println(tel);
}/*匹配*/
public static voidfunctionDemo_1() {
String tel= "18781098686";//String match = "1[358][0-9]{9}";
String match = "1[358]//d{9}"; //第一个数字取1第二个数字取3或者5或者8第三个数字取0~9第四个数字取9位
Boolean b =tel.matches(match);
System.out.println(tel+"::"+b);
}/*切割*/
public static voidfunctionDemo_2() {
String str= "zhangsan###lisi----zhaoletttwangwu";
String[] names= str.split("(.)\\1+"); //(X)捕获组
for(String name:names){
System.out.println(name);
}
}
}
四、练习1
packagecom.JavaZhengZe;/*** @Author wufq
* @Date 2020/9/17 17:51*/
public classRegexDemo02 {public static voidmain(String[] args){/** 1、治疗口吃:我我....要要要要要要要....学学学....编编编程
**/test_1();
}public static voidtest_1() {
String str= "我我....要要要要要要要....学学学....编编编程";//替换.
str = str.replaceAll("\\.+","");
System.out.println(str);//替换叠词
str=str.replaceAll("(.)\\1+" , "$1");
System.out.println(str);
}
}