字符串中的 **pubic boolean matches(String regex)**方法可以判断字符串是否满足正则的规则
正则表达式主要有两个作用:
一:更简单的校验字符串是否满足规则
二:更简单的在一段文本中查找满足要求的内容
比如:校验门牌号是否符合规则
不用正则的写法:
public static void main(String[] args) {
String s1 = "13#607";
System.out.println(Check(s1));
}
public static boolean Check(String s){
//前两位的楼号检验
for (int i = 0; i < 1; i++) {
if (s.charAt(i) < '0' || s.charAt(i) > '9'){
return false;
}
}
//中间的#检验
if (s.charAt(2) != '#'){
return false;
}
//门牌号检验
for (int i = 3; i < 6; i++) {
if (s.charAt(i) < '0' || s.charAt(i) > '9'){
return false;
}
}
//若都满足 返回true
return true;
}
用正则的写法:
public static void main(String[] args) {
String s1 = "13#607";
String regex = "\\d{2}#\\d{3}";
System.out.println(s1.matches(regex));
}
可见正则是十分方便简单的。
常用的正则符号有:
|。。。。。。。。。。。。。。或者的意思
&&。。。。。。。。。。。。。而且的意思
字符类(只匹配一个字符)
[ abc ]…………………………………该字符只能是abc其中一个
[ ^abc ]………………………………该字符是除了abc的一个字符
[ a-zA-Z ]………………………………该字符是a-z和A-Z范围中的一个字符
[ a-d [ m-p ] ]…………………………该字符是a-d或m-p范围中的一个字符
[ a-z&& [ def ] ]………………………该字符是a-z范围和def三个字符的交集 等同于[ def ]
[ a-z&& [ ^bc ] ]………………………该字符是a-z范围和非bc的交集 等同于[ ad-z ]
[ a-z&& [ ^m-p ] ]…………………该字符是a-z范围和除了m-p范围的交集 等同于[ a-lq-z ]
String s1 = "a";
String regex = "[abc]";
System.out.println(s1.matches(regex));//true
预定义字符(只匹配一个字符)
注意:在java中 “ \ ”为转义字符 所以要使用 " \ "来区分正则表达式
. —————————————— 任何一个字符
\d ————————————— 一个数字 等同于[ 0-9 ]
\D——————————————非数字
\s——————————————空白字符 [ \t \n \x0B \f \r ]
\S——————————————非空白字符
\w——————————————英文,数字,下划线 [ a-zA-Z_0-9 ]
\W——————————————非\w
String s1 = "12";//有两个字符
String regex = "\\d";//正则只有一个字符
System.out.println(s1.matches(regex));//false----只匹配一个字符 所以不符合正则
数量词(可匹配多个字符)
X?————————————————X,一次或0次
X*————————————————X,0次或多次
X+————————————————X,一次或多次
X{ n }————————————————X,正好n次
X{ n, }————————————————X,至少n次
X{ n,m }————————————————X,至少n次但不超m次
String s1 = "123456789";
String regex = "\\d{9}";//数字出现九次
System.out.println(s1.matches(regex));//true
一, public boolean matches(String regex) ------------------- 判断字符串是否满足正则的规则
二,public String replaceAll(String regex,String newStr) -------------- 按照正则的规则进行字符串的替换
String s1 = "张三123456789李四asdfjlkvajd王五";//要把字符串替换为 张三和李四和王五
//查找符合 数字 和 字母的正则
String regex = "\\w+";//(英文,数字,下划线)可以出现1次或多次
String result = s1.replaceAll(regex,"和");
System.out.println(result);//张三和李四和王五
三,public String[ ] split(String regex)---------------按照正则的规则切割字符串
String s1 = "张三123456789李四asdfjlkvajd王五";//要把字符串切割成【张三,李四,王五】
//查找符合 数字 和 字母的正则
String regex = "\\w+";//(英文,数字,下划线)可以出现1次或多次
String[] result = s1.split(regex);
for (int i = 0; i < result.length; i++) {
System.out.println(result[i]);//张三 李四 王五
}
在JDK API文档中官方说法是:
正则表达式的编译表示形式。
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p = Pattern.compile(“a*b”); //创建Pattern对象p,调用静态方法compile存放regex正则表达式
Matcher m = p.matcher(“aaaaab”); //获取文本匹配器对象m,用p调用matcher方法匹配目标字符串
boolean b = m.matches(); //m调用matches方法,判断目标字符串是否满足正则
补充:m.find() boolean类型,若m匹配到符合要求的内容,底层会记录该内容的起始索引 和 末尾索引+1‘
m.group() String类型,会按照find方法记录的索引进行截取,截取的方式等同于 subString
我的理解是:
这是固定格式,比如我们要从一段文字中爬取固定文字,可以套用
我要从
”移动端开发者专属APP: CSDN APP、CSDN学院APP;新媒体矩阵微信公众号:CSDN资讯、程序人生、GitChat、CSDN学院、AI科技大本营、区块链大本营、CSDN云计算、GitChat精品课、人工智能头条、CSDN企业招聘。”
这一段文字中爬取“CSDN”
String s1 = "移动端开发者专属APP: CSDN APP、CSDN学院APP;新媒体矩阵微信公众号:CSDN资讯、程序人生、GitChat、CSDN学院、AI科技大本营、区块链大本营、CSDN云计算、GitChat精品课、人工智能头条、CSDN企业招聘。";
Pattern p = Pattern.compile("CSDN");
Matcher m = p.matcher(s1);
while (m.find()){//若能找到,则循环继续
String s = m.group();
System.out.println(s);
}
比如一个字符串“abbbbbbbbcccccccc”
使用regex为ab+ 进行爬取
贪婪爬取:abbbbbbbb
非贪婪爬取:ab
String s1 = "abbbbbbbbcccccccc";
Pattern p = Pattern.compile("ab+");
Matcher m = p.matcher(s1);
while (m.find()){
String s = m.group();
System.out.println(s);//结果abbbbbbbb
}
JAVA默认的是贪婪爬取
若要变成非贪婪爬取,需要在数量词后面加上?
String s1 = "abbbbbbbbcccccccc";
Pattern p = Pattern.compile("ab+?");
Matcher m = p.matcher(s1);
while (m.find()){
String s = m.group();
System.out.println(s);//结果ab
}
什么是分组?
简单来说,一个括号就是一个组,按左括号,从左到右,一次为1组,2组,3组······
例如 “( \\d ( \\w ) )( \\s )”~~~~~~~~~d所在的组为第一组,w所在的组为第二组,s所在的组为第三组
捕获分组:就是把一组的数据捕获出来,再用一次(相同的数据)
【正则的内部】\\组号:把第x组的内容再用一次
String s1 = "a123a";
boolean f1 = s1.matches("(.).+\\1");//true
//第一位可以是任意字符,第二位及后面代表任意字符可以出现一次或多次,最后一位\\1表示第一位的数据再次出现
String s1 = "a123b";
boolean f1 = s1.matches("(.).+\\1");//false
【正则的外部】$组号:把第x组的内容再用一次
String s1 = "我要学学学学学习!";
String result = s1.replaceAll("(.)\\1+","$1");
//正则的含义:任意字符 获取出来的数据可以出现一次或多次,之后用获取出来的数据替换之前的重复的数据
System.out.println(result);//我要学习!
非捕获分组:分组之后不需要本组数据,仅仅是括起来,括号不占用组号
★正则表达式1(?:正则表达式2)·····获取正则1和2(正则1后面的内容是正则2)
正则表达式1(?=正则表达式2)·····获取正则1(正则1后面的内容是正则2)
正则表达式1(?!正则表达式2)·····获取正则1(正则1后面的的内容是正则2取反)
写稿不易,麻烦各位看官给个赞叭!!!