目录
一:正则表达式应用实例
1.1 验证汉字:
public static void main(String[] args) {
//1.验证汉字
String content="周嘉兴aa教育";
String regExp="^[\u0391-\uffe5]+$";
Pattern pattern=Pattern.compile(regExp);
Matcher matcher=pattern.matcher(content);
if(matcher.find()){
System.out.println("该字符串是由汉字组成的");
}else {
System.out.println("该字符串不是由汉字组成的");
}
}
1.2 验证邮政编码:(是由(1-9)开头的6位数,比如123890)
//2.验证邮政编码
String content="123890";
String regExp="^[1-9]\\d{5}$";
Pattern pattern=Pattern.compile(regExp);
Matcher matcher=pattern.matcher(content);
if(matcher.find()){
System.out.println("该字符串是由一段数字串组成的");
}else {
System.out.println("该字符串不是由一段数字串组成的");
}
1.3 验证QQ号:(是由(1-9)开头的5位至10位数)
//3.验证QQ号
String content="1238900000";
String regExp="^[1-9]\\d{4,9}$";
Pattern pattern=Pattern.compile(regExp);
Matcher matcher=pattern.matcher(content);
if(matcher.find()){
System.out.println("该字符串是由QQ号组成的");
}else {
System.out.println("该字符串不是由QQ号组成的");
}
1.4 手机号码:(必须以13,14,15,18开头的11位数)
// 4.手机号码:(必须以13,14,15,18开头的11位数)
String content="13389000000";
String regExp="^1[3458]\\d{9}$";
Pattern pattern=Pattern.compile(regExp);
Matcher matcher=pattern.matcher(content);
if(matcher.find()){
System.out.println("该字符串是由手机号组成的");
}else {
System.out.println("该字符串不是由手机号组成的");
}
1.5 验证URL:
//5.验证URL:(https://www.bilibili.com/video/BV1Eq4y1E79W?p=17&spm_id_from=pageDriver)
String content="https://www.bil-ibili.com/video/-BV1Eq4y1E79W?p=17&spm_id_from=pageDriver";
// String content="https://www.biblibili.com";
// String regExp="^((https|http)://)([\\w-]+\\.)+[\\w-\\?/]+$";
// String regExp="^(https|http)://(\\w+\\.)(.+)$"; // -----(成功)
//标准格式:(注意:[.?*]表示匹配就是.本身)
String regExp="(^((https|http)://))?([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.#]*)?$";
Pattern pattern=Pattern.compile(regExp);
Matcher matcher=pattern.matcher(content);
if(matcher.find()){
System.out.println("该字符串是由URL组成的");
}else {
System.out.println("该字符串不是由URL组成的");
}
二:正则表达式三个常用的类
java.util.regex包主要包括以下三个类:Pattern类、Matcher类和PatternSyntaxException类
2.1 Pattern类:
pattern对象是一个正则表达式对象。Pattern类没有公共构造方法。要创建一个Pattern对象,调用其公共静态方法,它返回一个Pattern对象。该方法接收一个正则表达式作为它的第一个参数,比如:Pattern r=Pattern.compile(pattern);
Pattern类的方法matches:(重点)
可以用 matches方法来根据我们的需求来判断字符串的类型。
2.2 Matcher类:
Matcher对象是对输入字符串进行解释和匹配的引擎。与Pattern类一样,Matcher也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象
Matcher类的方法及说明:
2.3 PatternSyntaxException类:
PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
三:分组、捕获、反向引用
要想解决前面的问题,我们需要了解正则表达式的几个概念:
1.分组:
我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可以看作是一个子表达式/一个分组。
2.捕获:
把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显示命名的组里,方便后面使用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推,组0代表的是整个正则式。
3.反向引用:
圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称为反向引用,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,内部反向引用\\分组号,外部反向引用$分组号。
4.案例:
4.1 要匹配两个连续的相同数字:(\\d)\\1
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp10 {
public static void main(String[] args) {
//1.匹配两个连续的相同数字
String content="1111";
String regStr="(\\d)\\1";
/*Pattern pattern=Pattern.compile(regStr);
Matcher matcher=pattern.matcher(content);
while (matcher.find()){
System.out.println(matcher.group(0));
}*/
//可以判断一个两位数的各个数字是否相同
if(Pattern.matches(regStr,content)){
System.out.println("yes");
}else {
System.out.println("no");
}
}
}
4.2 要匹配两个连续的相同数字:(\\d)\\1{4}
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp10 {
public static void main(String[] args) {
//2.要匹配五个连续的相同数字
String content="11111";
String regStr="(\\d)\\1{4}";
/*Pattern pattern=Pattern.compile(regStr);
Matcher matcher=pattern.matcher(content);
while (matcher.find()){
System.out.println(matcher.group(0));
}*/
//可以判断一个两位数的各个数字是否相同
if(Pattern.matches(regStr,content)){
System.out.println("yes");
}else {
System.out.println("no");
}
}
}
4.3 要匹配个位与千位相同,十位与百位相同的数5225,1551:(\\d)(\\d)\\2\\1
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp10 {
public static void main(String[] args) {
//3.要匹配个位与千位相同,十位与百位相同的数5225,1551
String content="5225";
String regStr="(\\d)(\\d)\\2\\1";
/*Pattern pattern=Pattern.compile(regStr);
Matcher matcher=pattern.matcher(content);
while (matcher.find()){
System.out.println(matcher.group(0));
}*/
//可以判断一个两位数的各个数字是否相同
if(Pattern.matches(regStr,content)){
System.out.println("yes");
}else {
System.out.println("no");
}
}
}
4.4 请在字符串中检索商品编号,形式如:12321-333999111 这样的号码,要求满足前面是一个5位数,然后一个-号,然后是一个九位数,连续的每三个要相同:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp10 {
public static void main(String[] args) {
//.4 请在字符串中检索商品编号,形式如:12321-333999111 这样的号码,要求满足前面是一个5位数,然后一个-号,然后是一个九位数,连续的每三个要相同
String content="12321-333999111";
String regStr="^\\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}";
/*Pattern pattern=Pattern.compile(regStr);
Matcher matcher=pattern.matcher(content);
while (matcher.find()){
System.out.println(matcher.group(0));
}*/
//可以判断一个两位数的各个数字是否相同
if(Pattern.matches(regStr,content)){
System.out.println("yes");
}else {
System.out.println("no");
}
}
}
4.5 经典的结巴程序:
package regexp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp10 {
public static void main(String[] args) {
//.5.将“我...我要...学学学学...编程java”通过正则表达式修改成“我要学编程java”;
//1.首先,先消去字符串中所有的.
String content="我...我要...学学学学...编程java";
String regStr="\\.";
Pattern pattern=Pattern.compile(regStr);
Matcher matcher=pattern.matcher(content);
content=matcher.replaceAll("");
/*
//2.去掉所有重复的字:我我要学学学学编程java
//思路:
//(1)使用(.)\\1+
//(2)使用反向引用$1来替换匹配到的内容
//注意:因为正则表达式变化,所以需要重置matcher
pattern=Pattern.compile("(.)\\1+");
matcher=pattern.matcher(content);
while (matcher.find()){
System.out.println("找到="+matcher.group(0));
}
//使用反向引用$1来替换匹配到的内容
content=matcher.replaceAll("$1");
System.out.println("content: "+content);
*/
//使用一条语句,去掉重复的字,我我要学学学学编程java
content=Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");
System.out.println(content);
}
}
五:String类中使用正则表达式
5.1 案例1:实现替换功能:
package regexp;
import java.util.regex.Pattern;
public class RegExp11 {
public static void main(String[] args) {
String content="JDK1.4,JDK1.5,JDK8.0";
content= Pattern.compile("JDK1\\.4|JDK1\\.5").matcher(content).replaceAll("JDK");
System.out.println(content);
}
}
5.2 案例2:实现判断功能:
String content="13812345678";
// if(Pattern.matches("^(138|139)\\d{8}",content)){
if(content.matches("^1(38|39)\\d{8}")){ //这种方法比较简洁
System.out.println("YES");
}else {
System.out.println("NO");
}
5.3 案例3:实现分割功能:
String content="wo-ai-shang-hai";
String[] str=content.split("-");
for(String s:str){
System.out.print(s+" ");
}
六:正则表达式练习题
6.1 作业一:
String content="1494972346@qq.com";
if(content.matches("(\\w+|_|-)@(\\w+\\.*)[a-zA-Z]+$")){
System.out.println("YES");
}else {
System.out.println("NO");
}
6.2 作业二:
String content=String.valueOf(-12.00);
if(content.matches("^(-?)\\d+\\.([1-9]+)$")){
System.out.println("该数字不是整数");
}else {
System.out.println("该数字是整数");
}
6.3 作业三:
String content="http://www.sohu.com:8080/abc/index.htm";
String regStr="^([a-zA-Z]+)://([a-zA-Z.]+):(\\d+)[\\w-/]*/([\\w.])+$";
Pattern pattern=Pattern.compile(regStr);
Matcher matcher=pattern.matcher(content);
while (matcher.matches()){//整体匹配,如果匹配成功,可以通过group(x),获取对应分组的内容
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
System.out.println(matcher.group(4));
}