Java 正则表达式【基本语法】

简介: Java 正则表达式【基本语法】

基本介绍

首先我们需要了解的是正则表达式中的各种元字符的功能,主要分为以下几种:

  1. 限定符
  2. 选择匹配符
  3. 分组组合和反向引用符
  4. 特殊字符
  5. 字符匹配符
  6. 定位符

需要注意的是:在 Java正则表达式中,两个斜杠 \\ 相当于其它语言中的一个斜杠 \ 。

字符匹配符

符号 含义 示例 解释
[ ] 可以匹配的字符列表 [abcjs] a、b、c、j、s都可以匹配到
[^] 不可以被匹配的字符列表 [^abc] a、b、c不可以被匹配
- 连字符 a-z 可以匹配任意a到z的字母
. 匹配除 \n 之外的任何字符 a..b 以a开头b结尾的字符串,中包括任意两个字符
\\d 匹配单个数字字符 \\d{3}(\\d)? 匹配连续3个或4个数字的字符串
\\D 匹配非数字字符 \\D(\\d)* 以单个非数字字符开头,后面接任意个数字的字符串
\\w 匹配单个数字、英文字符、下划线 \\d{3}\\w{4} 以3个数字字符开头的长度为7的数字字母字符串
\\W 匹配单个非数字、非英文字符、非下划线 \\W+\\d{2} 以至少一个非数字字母字符开头,两个数字字符结尾的字符串
\\s 匹配任何空白字符(空格,制表符等)
\\S 匹配任何非空白字符,和\s刚好相反

image.png

选择匹配符

符号 含义 示例 解释
| 或者的意思 ab|cd 匹配ab或者cd

用于在匹配时有选择的降低匹配标准。

限定符

用于指定其前面的字符和组合项连续出现多少次

符号 含义 示例 说明 示例
* 重复0次或n次 (abc)* 以abc开头的,子串只包含abc的字符串 abc,abcabc
+ 重复1次或多次 (abc)+ 至少以1个abc开头,子串只包含abc的字符串 abc,abcabc
重复0次或1次 (abc)? 以abc开头的字符串 abc
{n} 限定只能出现n次 [a-d]{3} 由连续的 a、b、c、d组成的字符串中任意长度为3子串


定位符

规定要匹配的字符在字符串中出现的位置,比如是在字符串开始还是在结束处。

符号 含义
^ 开头
$ 结尾
\\b 匹配目标字符串的边界,子串之间的空格
\B 匹配字符的非边界

这里主要演示一下 \\b 和 \\B :

public static void main(String[] args) {
        String content = "我爱学习 学习不爱我 学习很快乐";
        String regex = "学习\\B";
        Pattern compile = Pattern.compile(regex);
        Matcher matcher = compile.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group());
        }
    }

当我们设置匹配语句为 \\b 的时候,输出结果:

学习

当我们设置匹配语句为 \\B 的时候,输出结果:

学习
学习

可以看到,\\b 匹配的是子串"学习"后是空格的,而 \\B 刚好相反。

分组

捕获分组


我们上一篇博客写过分组的案例,也就是 group(0),group(1)这种,也叫做非命名捕获。


这里主要介绍一种新的分组方法,叫做命名捕获,也就是说我们可以自定义组的名字。相比较之前的哪一种,它既可以使用非命名捕获(通过组号获取匹配的子串),也可以通过自定义的名字来捕获。


语法:<?<name><pattern>>


其中,需要先写一个问号?,<name>是我们对组的命名,不要太离谱就行;<pattern>是我们的正则表达式,和非命名捕获是一样的。

String content = "sajnj ax1122s sjnaj4529 s584";
        String regex = "(?<group1>\\d\\d)(?<group2>\\d\\d)";
        Pattern compile = Pattern.compile(regex);
        Matcher matcher = compile.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group("group1"));
            System.out.println(matcher.group("group2"));
        }

非捕获分组

       Java正则表达式中的不捕获匹配(Non-capturing Group)指的是使用括号来分组匹配,但不会将该分组的匹配结果保存到匹配结果中。这样可以在正则表达式中使用括号进行逻辑分组,但不会捕获分组的内容,从而减少内存开销并提高性能。


       也就是说,虽然有括号但是不算是一个组,你使用组索引 matcher.group(n) 是获取不到结果的。

String content = "industries industry";
        Pattern pattern = Pattern.compile("industr(?:y|ies)");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }

输出:

industries
industry

image.png

正向预查
String content = "My operating system is Windows 11,his operating system is Windows XP";
        Pattern pattern = Pattern.compile("Windows (?=11|XP)");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }

运行结果:

Windows
Windows

       调试正则表达式后,发现 (?=pattern)这种非捕获分组,它必须满足括号后面的条件才能被匹配,但是比如"Windows (?=11|XP)",要被匹配到的只可能是 "Windows 11" 或者 "Windows XP",但是这里的"11"和"XP"不会被保存到结果。

负向预查
String content = "My operating system is Windows 11,his operating system is Windows XP";
        Pattern pattern = Pattern.compile("Windows (?!8|9|10)");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }

运行结果:

Windows
Windows

       调试正则表达式后,发现 (?!pattern)这种非捕获分组,它必须满足括号后面的条件才能被匹配,但是比如"Windows (?=11|XP)",要被匹配到的只可能是除了 "Windows 11" 和 "Windows XP"之外的其他"Windows xxxx"的字符串,而且这里的"xxxx"同样不会被保存到结果。

相关文章
|
2天前
|
Java API 开发者
Java 8中的Lambda表达式:革新你的编程方式
【2月更文挑战第11天】 在本文中,我们将深入探讨Java 8引入的一个重要特性:Lambda表达式。这一创新不仅仅是对Java语言的一次更新,它代表了一种编程范式的转变,让开发者能够以更加简洁、功能强大的方式编写代码。通过本文,读者将了解Lambda表达式的基本概念、它如何简化代码、提高开发效率,以及在实际开发中如何正确使用Lambda表达式来处理常见的编程任务。我们将通过示例代码和比较分析,展示Lambda表达式的优势,并讨论其对Java生态系统的长远影响。无论你是Java新手还是有经验的开发者,本文都将为你揭示Lambda表达式如何革新你的编程方式。
|
3天前
|
Java 网络安全 开发者
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
12 0
|
3天前
|
机器学习/深度学习 Java 索引
39、一篇文章弄懂 Java 正则表达式中的量词、贪婪、勉强、独占和 String 的 matches 方法的底层【个人感觉非常值得学习】
39、一篇文章弄懂 Java 正则表达式中的量词、贪婪、勉强、独占和 String 的 matches 方法的底层【个人感觉非常值得学习】
18 0
|
3天前
|
Java
38、Java 中的正则表达式(单字符匹配和预定义字符)
38、Java 中的正则表达式(单字符匹配和预定义字符)
10 0
|
7天前
|
Java API
Java中的Lambda表达式简介及应用
【2月更文挑战第6天】本文将介绍Java中的Lambda表达式,探讨其基本概念、语法特点和应用场景。通过实际示例演示Lambda表达式在Java编程中的灵活运用,帮助读者更好地理解和应用这一强大的特性。
|
8天前
|
存储 Java 测试技术
滚雪球学Java(09):运算符、表达式和语句
【2月更文挑战第6天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
23 0
|
9天前
|
Java API
Java中的Lambda表达式应用及性能优化
【2月更文挑战第4天】 本文将深入探讨Java中Lambda表达式的应用和性能优化技巧。通过分析Lambda表达式的概念、特点以及在实际项目中的应用场景,帮助读者更好地理解和运用Lambda表达式。同时,结合实例演示如何通过一些简单而有效的方法来优化Lambda表达式的性能,提升程序的执行效率。
|
9天前
|
Java 开发者
Java中的Lambda表达式应用与实践
【2月更文挑战第4天】Lambda表达式是Java 8引入的一项重要特性,它简洁而强大,可以极大地提高代码的可读性和简洁性。本文将深入探讨Java中Lambda表达式的应用与实践,帮助读者更好地理解和运用这一功能。
10 3
|
9天前
|
并行计算 Java API
Java中的Lambda表达式应用与实例解析
【2月更文挑战第4天】本文将深入探讨Java编程语言中Lambda表达式的应用与实例解析,通过详细介绍Lambda表达式的概念、语法特点以及在实际项目开发中的运用,帮助读者更好地理解和运用这一强大的编程特性。
|
10天前
|
Java 开发者
Java中的Lambda表达式与函数式接口
【2月更文挑战第3天】传统的面向对象编程语言在处理函数式编程方面存在一定的局限性,而Java 8 引入了Lambda 表达式和函数式接口的概念,极大地提升了语言的灵活性和表达能力。本文将介绍Lambda 表达式和函数式接口在Java 中的基本概念、用法以及与传统面向对象编程的区别,帮助读者更好地理解并应用这些新特性。

相关产品

  • 云迁移中心