正则表达式
用某种模式去匹配字符串的一个公式。
快速入门
package regxp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class work01 {
public static void main(String[] args) {
String content="sadadasdasc简单生活";
//1.先创建一个Pattern对象﹐模式对象,可以理解成就是一个正则表达式对象
Pattern pattern = Pattern.compile("[a-zA-Z]+");
//2。创建一个匹配器对象
//理解:就是matcher匹配器按照pattern(模式/样式),到content文本中去匹配
// 找到就返回true,香则就返回false
Matcher matcher = pattern.matcher(content);
//3。可以开始循环匹配
while (matcher.find()) //匹配内容,文本,放到 m.group(0)
System.out.println("找到:" +matcher. group(0));
}
}
}
基本语法
转义号:\\
在匹配 .*+()$/?[]^{}符号的时候需要用到转义符号。
字符匹配符
匹配的时候设置不区分大小写
分组
代码练习
package regxp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class work01 {
public static void main(String[] args) {
String content="https://www.bilibili.com/video/BV1fh411y7R8?from=search&seid=1831060912083761326";
// 1.汉字
// String compile="^[\u0391-\uffe5]+$";
// 2.邮政编码
// 要求:是1-9开头的一个六位数.比如:123890
// String compile="^[1-9]\\d{5}$";
// 3.QQ号码
// 要求:是1-9开头的一个(5位数-10位数)比如:12389,1345687 ,187698765
// String compile="^[1-9]\\d{4,9}$";
// 4.手机号码
// 要求:必须以13,14,15,18开头的11位数,比如13588889999
// String compile="^(13|14|15|18)\\d{9}$";
// URL:如图:https://www.bilibili.com/video/BV1fh411y7R8?from=search&seid=1831060912083761326
String compile="^((http|https)://)([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.#]*)?$";
//1.先创建一个Pattern对象﹐模式对象,可以理解成就是一个正则表达式对象
Pattern pattern = Pattern.compile(compile);
//2。创建一个匹配器对象
//理解:就是matcher匹配器按照pattern(模式/样式),到content文本中去匹配
// 找到就返回true,香则就返回false
Matcher matcher = pattern.matcher(content);
//3。可以开始循环匹配
while (matcher.find()) {
System.out.println("满足条件");
}
}
}
常用类
pattern类
pattern对象是一个正则表达式对象。Pattern类没有公共构造方法。要创建一个 Pattern 对象,调用其公共静态方法,它返回一个 Pattern对象。该方法接受一个正则表达式作为它的第一个参数
matcher类
Matcher对象是对输入字符串进行解释和匹配的引擎。与Pattern类一样, Matcher也没有公共构造方法。你需要调用 Pattern对象的 matcher方法来获得一个 Matcher对象
方法
PatternSyntaxException
PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
反向引用
圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称为反向引用,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,内部反向引用\\分组号,外部反向引用$分组号
案例
- 要匹配两个连续的相同数字:(\\d)\\1
- 要匹配五个连续的相同数字:(\\d)\\1{4}
- 要匹配个位与干位相同,十位与百位相同的数5225,1551 (\\d)(\\d)\\2\\1
本章练习
package regxp;
import java.util.regex.Pattern;
public class work01 {
public static void main(String[] args) {
//结巴去重案例
String content="我...我要....学学学学....编程java!";
content=content.replace(".","");
content=Pattern.compile("(.)\\1*").matcher(content).replaceAll("$1");
System.out.println(content);
// 1.规定电子邮件规则为1.只能有一个@
// 2.@前面是用户名,可以是a-z A-Z0-9字符
// 3.@后面是域名,并且域名只能是英文字母,比如sohu.com
// 4.写出对应的正则表达式,验证输入的字符串是否为满足规则
String compile="^[\\w]+@[a-zA-Z]+\\.c(om|n)";
content="234235712@qq.com";
boolean matcher = Pattern.compile(compile).matcher(content).find();
System.out.println(matcher);
// 2.要求验证是不是整数或者小数
// 提示:这个题要考虑正数和负数比如:123 -345 34.89 -87.9
compile="^(-|\\+)*[0-9]+(\\.[0-9]+)?$";
boolean b = Pattern.compile(compile).matcher("a7.9").find();
System.out.println(b);
}
}