一、正则表达式概述
1、正则表达式用于操作字符数据
2、通过举例初步了解正则
* 定义一个功能对qq号进行校验
* 需求:长度5~15位,只能是数字,开头不能为0
----->一般的写法<------
package com.JavaZhengZe; /** * @Author wufq * @Date 2020/9/16 11:06 * * 正则表达式 * * 正则表达式用于操作字符串数据 */ public class RegexDemo { public static void main(String[] args){ String qq = "45668676"; checkQQ(qq); } /* * 定义一个功能对qq号进行校验 * 需求:长度5~15位,只能是数字,开头不能为0 * */ public static void checkQQ(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)
告知此字符串是否匹配给定的正则表达式。
package com.JavaZhengZe; /** * @Author wufq * @Date 2020/9/16 11:06 * * 正则表达式 * * 正则表达式用于操作字符串数据 */ public class RegexDemo { public static void main(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 * */ }
通过以上两段代码的比较发现:通过一些特定的符号来体现,所以我们为了掌握正则表达式。必须要学习一些符号。
虽然简化了,但是阅读性差。
二、常见的规则
\ 反斜线字符
制表符
回车符
新行符
f 换页符
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
. 任何字符(与行结束符可能匹配也可能不匹配)
* 表示匹配0-无穷
+ 表示匹配1-无穷
? 表示放在其他字符后面表示前面的字符可以有,也可以没有,或者放在*、+后面表示匹配尽可能少的字符
d 数字:[0-9]
D 非数字: [^0-9]
(X) X,作为捕获组
:表示字母数字与非字母数字的边界, 非字母数字与字母数字的边界。
B:表示字母数字与(非非)字母数字的边界,非字母数字与非字母数字的边界。
三、正则常见的功能
1、正则表达式对字符串的常见操作
1)匹配
其实使用的就是String类中的matches方法
2)切割
其实使用的就是String类中的split方法
3)替换
4)获取
package com.JavaZhengZe; import java.util.regex.Matcher; import java.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 class RegexDemo01 { public static void main(String[] args){ // functionDemo_1(); // functionDemo_2(); // functionDemo_3(); functionDemo_4(); } /*获取*/ public static void functionDemo_4() { String str = "da jia hao,ming tian bu shang ban"; String regex = "\b[a-z]{3}\b"; // ---> [a-z]{3}:a-z三位数 :表示字母数字与非字母数字的边界,非字母数字与字母数字的边界。 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 void functionDemo_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 void functionDemo_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 void functionDemo_2() { String str = "zhangsan###lisi----zhaoletttwangwu"; String[] names = str.split("(.)\1+"); //(X)捕获组 for(String name:names){ System.out.println(name); } } }
四、练习1
package com.JavaZhengZe; /** * @Author wufq * @Date 2020/9/17 17:51 */ public class RegexDemo02 { public static void main(String[] args){ /* * 1、治疗口吃:我我....要要要要要要要....学学学....编编编程 * */ test_1(); } public static void test_1() { String str = "我我....要要要要要要要....学学学....编编编程"; //替换. str = str.replaceAll("\.+",""); System.out.println(str); //替换叠词 str=str.replaceAll("(.)\1+" , "$1"); System.out.println(str); } }