详解 正则表达式

在本篇博文中,本人将讲解一个和平台无关的知识点——正则表达式。
可能同学们对于这个名词十分地陌生,但是,相信同学们对于“爬”这个词会很敏感。
没错,本篇博文所要讲解的知识点,就可以应用到“爬”出我们所需要的信息的场景中。
那么,废话不多说,现在就开始本人这篇博文的主要内容的讲解吧!

首先,本人来解释一下什么是 正则表达式

定义:

定义:所谓的正则表达式是指 :
一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则

而在Java中,处理正则表达式的方法在 java.util.regex Pattern类 中。

那么,在了解了正则表达式的定义后,本人来介绍一下 正则表达式 的组成规则

组成规则:

A:字符
x 字符 x。例:'a'表示字符a
\ 反斜线字符。
新行(换行)符 ('u000A')
回车符 ('u000D')
----------------------------------------------------------------------------
B:字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括
----------------------------------------------------------------------------
C:预定义字符类
. 任何字符 那么,怎么表示呢? .
d 数字:[0-9]
w 单词字符:[a-zA-Z_0-9]
在正则表达式里面组成单词的东西必须有这些东西组成
s 匹配空格字符
-----------------------------------------------------------------------------
D:边界匹配器
^ 行的开头
$ 行的结尾
 单词边界
就是不是单词字符的地方。
----------------------------------------------------------------------------
E:Greedy 数量词
X? X,一次或一次也没有 比如""空串 就是没有
X* X,零次或多次 大于等于1次 都算多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次

在这里,本人再通过代码以及注释来解释一下上述组成规则:

	regx="[a,b,c,d,e,1,2,3]"; //是列表中的某一个字符就行
    regx="[a-z]"; //是小写字母就行
    regx="[0-9]"; //是数字字符就行
    regx="\d";  // 这个等同于 [0-9]
    regx="[A-Z]"; //是大写字母就行
    regx="[a-zA-Z0-9]"; //是26个大小写字母 或者 数字之一就行
    regx="\w"; //等同于 [a-zA-Z_0-9]
    
    regx="."; //. 匹配单个任意字符
    regx="\."; // \ 转义符,这里的“\.”表示只匹配“.”字符
    regx = ".."; // 表示匹配两个任意字符
    
    regx = "[^A-Z]"; //取反,不是大写字母就行
    regx="|"; // |表示 或者关系
    regx="\|"; // 这里的 “\.” 表示只匹配“|”字符
    regx="&"; // &表示 与关系
    
    regx="\s"; //匹配空格
    
    //量词  ? 一次或一次也没有  空串就是没有出现
    regx="a?";
    
    //* :零次或多次 一次也算多次
    regx="[a-z]*";
    
    //+ :一次或多次
    regx="[0-9]+";
    regx="\w+";
    
    //恰好几次
    regx="[0-9]{5}";	//表示只匹配5个数字字符的字符串
    
    //至少几次
    regx="[a-z]{5,}";	//表示只匹配至少5个但只能全是小写字母字符的字符串
    
    //一个范围 大于等于5 小于等于10
    regx = "[a-z]{5,10}"; //表示只匹配 5~10个小写字母 组成的字符串

那么,现在本来通过一个例子来为同学们展示一下“正则表达式”的基本使用方法:
现在我们要求 :将源字符串中的等号全部去掉

package com.youzg.about_regular_expression.test

public class DeleteEqualSign {
    public static void main(String[] args) {
        String str="aaaa=bbbb=cccc=dddd";  //aaaabbbbcccdddd;
        String replace = str.replace("=", "");
        System.out.println(replace);
    }
}

那么,我们来看一下运行结果:
在这里插入图片描述
那么,通过这个例子,相信同学们已经对于这个知识点有了初步的理解。
接下来,本人再来通过几个例子来带同学们巩固一下以上方法 的使用:
要求:判断用户输入的邮箱是否有效

package com.youzg.about_regular_expression.test

import java.util.Scanner;

public class CheckE-mail {

    public static void main(String[] args) {
        String emailRegx="[a-zA-Z]\w{5,17}@(163|sina|google)\.(com|cn|net|org)";

        Scanner sc = new Scanner(System.in);
        String inputString = sc.nextLine();
        boolean matches1 = inputString.matches(emailRegx);
        System.out.println(matches1);
    }
    
}

现在,我们来看一下运行结果:
在这里插入图片描述

要求:将给定字符串中的数字进行排序

package com.youzg.about_regular_expression.test

import java.util.Arrays;

public class SortString {
    public static void main(String[] args) {
/*
*
*  * 分析:
 * a: 定义目标字符串"91 27 46 38 50"
 * b: 对这个字符串进行切割,得到的就是一个字符串数组
 * c: 把b中的字符串数组转换成int类型的数组
 * (1): 定义一个int类型的数组,数组的长度就是字符串数组长度
 * (2): 遍历字符串数组,获取每一个元素.将其转换成int类型的数据
 * (3): 把int类型的数据添加到int类型的数组的指定位置
 * d: 排序
 * e: 创建一个StringBuilder对象,用来记录拼接的结果
 * f: 遍历int类型的数组, 将其每一个元素添加到StringBuilder对象中
 * g: 就是把StringBuilder转换成String
 * h: 输出
*
*
* */
        String str = "91    27    46   38    50000      50  5  9  9000";
        String[] strings = str.split("\s+");

        int[] ints = new int[strings.length];

        for (int i = 0; i < strings.length; i++) {
            ints[i]=Integer.parseInt(strings[i]);
        }
        //排序
        Arrays.sort(ints);
        //遍历 int 数组 凭借成字符串
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < ints.length; i++) {
            sb.append(ints[i]).append(" ");
        }
        String string = sb.toString().trim();
        System.out.println(string);
    }
}

我们来观看下运行结果:
在这里插入图片描述
那么,现在,本人来介绍一下正则表达式的一个很强大的功能——替换功能

正则表达式的 替换功能:

这个知识点,本人通过一个例子来展示:
要求:将给定字符串中的数字都去除掉

package com.youzg.about_regular_expression.test

public class RemoveDigit {

    public static void main(String[] args) {
        String str2 = "aaaa=1111125522bbbb55444444cccc6665444444dddd";
        //根据正则表达式去替换
        String s = str2.replaceAll("[0-9]+", "");
        System.out.println(s);

    }
    
}

在这里插入图片描述

那么,通过上面的三个例子,相信同学们对于正则表达式的基本方法的使用已经熟悉了,现在,本人来讲解有关正则表达式的最后一个知识点——正则表达式的获取功能

正则表达式的 获取功能:

在介绍正则表达式的这个功能前,本人先来介绍一下Pattern和Matcher这两个类:
对于这两个类的知识点,我们无需了解太多,只要清楚使用的顺序即可;
典型的调用顺序是 :

	Pattern p = Pattern.compile(正则表达式);
	Matcher m = p.matcher(待检测表达式);
	boolean b = m.matches();

那么,现在,本人来通过一个例子来展示一下 正则表达式的 获取功能;
要求:将给定字符串中的由三个字母构成的子串挑取出并输出:

package com.youzg.about_regular_expression.test

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GetTheActivePart {
    public static void main(String[] args) {
        //需求:获取下面这个字符串中由三个字符组成的单词
        String str="da jia ting wo shuo, jin tian yao xia yu, bu shang wan zi xi, gao xing bu?";
       //1.三个字符组成的单词 的正则  [a-z]{3}
        //2.模式器和匹配器配合起来,可以根据正则获取出符合正则的字符串

        //获取模式器
        Pattern p = Pattern.compile("\b[a-z]{3}\b");

        //获取匹配器
        Matcher matcher = p.matcher(str);
        
        while (matcher.find()){
            String group = matcher.group();
            System.out.println(group);
        }
    }
}

运行结果如下:
在这里插入图片描述
也正是因为正则表达式的 获取功能,以及前端的相关知识,我们能够“爬”出我们想要获知的信息。


原文地址:https://www.cnblogs.com/codderYouzg/p/12418306.html