JAVA:正则表达式(入门)

JAVA:正则表达式(入门)

正则表达式

  • JAVA:正则表达式(入门)
  • 前言
  • 正则的作用
  • 正则的符号含义
  • 正则表达式在字符串中的常用方法
  • 正则表达式对象Pattern(爬虫)
  • 贪婪爬取与非贪婪爬取
  • 捕获分组与非捕获分组
  • 小结

前言

字符串中的 **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]);//张三  李四  王五
}

正则表达式对象Pattern(爬虫)

在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取反)

小结

写稿不易,麻烦各位看官给个赞叭!!!

你可能感兴趣的:(java,开发语言,正则表达式)