栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java学习第二十六天——正则表达式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java学习第二十六天——正则表达式

1 概述

n正则表达式定义了字符串的模式。

n正则表达式可以用来搜索、编辑或处理文本。

正则表达式定义了字符串模式,可以用来搜索,编辑,处理文本,还可以做数据提取操作
 * 不仅限于某一种语言,但是在每种语言中有细微的差别
 * java中 1.4推出,在java.util.regex包下
 * 在java中使用转义符,把有意义的字符转换为无意义的字符
 * 但是在正则表达式中,也是转义符,所以如果我们在java中写正则表达式时,要写两个,即\
 * 

2 常用语法

常用语法:
 *                  转义符
 *                .  匹配任意字符
 *           取值范围:
 *                [abc]: 可能是a,也可能是b,还可能是c
 *                [^abc]: 不是a,b,c中的任意一个
 *                [a-zA-Z]: 匹配大小写字母
 *                [^a-zA-Z]: 非大小写字母
 *                [0-9]: 数字
 *                [a-zA-Z0-9]: 大小写字母和数字
 *           简洁表示:
 *                .: 任意字符
 *                d: 表示数字[0-9]
 *                D: 表示非数字[^0-9]
 *                s: 表示由空字符组成
 *                S: 表示由非空字符组成
 *                w: 表示字母,数字,下划线[a-zA-Z0-9]
 *                W: 表示非字母,数字,下划线[^a-zA-Z0-9]
 *           数量相关:
 *                ?: 表示出现0或1次
 *                +: 表示出现1次或者多次  count>=1
 *                *: 表示出现0次或0次以上  count>=0
 *                {n}: 表示出现n次
 *                {n,}: 表示出现n次及n次以上  count>=n
 *                {n,m}: 表示出现n到m次  n<=count<=m

 

 

 3 (),[],{}的区别

* (): 表示一个整体
 *      ([a-z]|[0-9]){2}
 *      (0-9): 注意:表示整体,而不是范围,所以这个匹配的是字符串0-9,而不是数字0到9
 * []: 可以理解为字符组,字符组中-为连接符,表示区间范围
 *      [0-9]: 表示1,2,3,4,5,6,7,8,9都可以(即是0到9)
 * {}: 表示范围
 * ^: 表示开头,但在[]中表示取反
 * $: 表示结尾

 4 练习

4.1 匹配整数和小数

d 数字

. 任意字符

/ 转义

+ 1次或多次

? 0次或1次

() 把.和d+看做整体

d+(.d+)?

4.2 电话

d{11}

^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])d{8}$

4.3 匹配正整数

[1-9][0-9]*

4.4 非负数

\d+

4.5 整数

(-?[1-9]\d*)|0

5 java中的正则表达式

在java中,正则表达式封装为三个相关的类
 *                  PatternSyntaxException: 异常类
 *                  Pattern: 正则表达式对象,能做一些简单操作
 *                  Matcher: 支持强大的正则表达式

6 Pattern

6.1 概述

l用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建

l可以通过Pattern.complie(String regex)创建一个正则表达式

l只能做一些简单的匹配操作

6.2 使用

 Pattern: 很多时候我们直接使用String中的三个方法即可
 *                验证: 校验操作,boolean matches(String regex)
 *                拆分: String[] split(String regex)
 *                替换: String replaceAll(String regex,String replace)
 

// 校验
    public static void test2() {
        String regex = "(-?[1-9]\d*)|0";
        String str = "-123";
        // 全词匹配,静态方法
        boolean flag = Pattern.matches(regex, str);
        System.out.println(flag);
        // String中的方法
        System.out.println(str.matches(regex));
    }

    // 拆分
    public static void test1() {
        String str = "1,2,3,4,5";
        // 创建正则表达式对
        Pattern pattern = Pattern.compile(",");
        // 拆分方法
        String[] strs = pattern.split(str);
        for (String string : strs) {
            System.out.println(string);
        }
        System.out.println("=========");
        strs = str.split(",");
        for (String string : strs) {
            System.out.println(string);
        }

7 Matcher

7.1 概述

  1. 构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例 Matcher m = p.matcher("aaaaab");
  2. 支持便捷强大的正则匹配操作,包括分组、多次匹配支持

7.2 三大方法

Matcher.matches():对整个字符串进行匹配,只有整个字符串都匹配了才返回true

Matcher.lookingAt():对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true

Matcher.find():对字符串进行匹配,匹配到的字符串可以在任何位置

7.3 字符串匹配模式

// 整数规则
        String regex = "(-?[1-9]\d*)|0";
        // 需要校验的字符串
        String input = "12.12";
        // 引擎对象
        Pattern pattern = Pattern.compile(regex);
        // 匹配器对象
        Matcher matcher = pattern.matcher(input);
        
        // false
        System.out.println(matcher.matches());
        // 不要连着使用,每次使用 都重新打开一个 matcher对象即可
        // find可以调用多次,因为find适合做一些提取操作
        matcher = pattern.matcher(input);
        System.out.println(matcher.find());
        System.out.println(matcher.find());
        System.out.println(matcher.find());
        matcher = pattern.matcher(input);
        System.out.println(matcher.lookingAt());

7.4 整数提取

// 整数规则
        // [u4e00-u9fa5] 汉字范围
        // 一个小括号 就是一组
        String regex = "([u4e00-u9fa5]{2,3})电话号码是(\d{11})";
        // 需要校验的字符串
        String input = "asd小明电话号码是13113113111sass张小黑电话号码是15115115111";
        // 引擎对象
        Pattern pattern = Pattern.compile(regex);
        // 匹配器对象
        Matcher matcher = pattern.matcher(input);
        
        // 想要获取下一个匹配的数据,只需要再次调用find即可
        // 如果find为false,说明后面没有符合条件的数据了
        while (matcher.find()) {
            // 0或者无参 都是获取匹配到的整个数据
            // 1 就是第一组 , 2 就是第二组
            System.out.println(matcher.group(0));
            System.out.println(matcher.group(1));
            System.out.println(matcher.group(2));
        }

7.5 叠词去重

案例 

  我我...我我...我要..要要...要要...学学学..学学...编编编编....编程..程....程程程程..程.
 *  转换为我要学编程
 *  1 只留下汉字,其余字符去掉
 *  2 把重复数据分为两组 , 比如 1111,分为 1 和 111
 *  3 使用 1 把 1111 替换

String string = "我我......我要..要要...要要...学学学..学学...编编编编....编程..程....程程程程..程.";
        string = string.replaceAll("[^u4e00-u9fa5]", "");
        System.out.println(string);
        String regex = "(.)(\1+)";
        string = string.replaceAll(regex, "$1");
        System.out.println(string);

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390069.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号