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刚好相反

Java 正则表达式默认是区分大小写的,如何实现不区分大小写?

(?i)abc​​​
abc 都不区分大小写
a(?i)bc
bc 不区分大小写
a((?i)b)c
只有 b不区分大小写
Pattern.compile(regex,Pattern.CASE_INSENSITIVE)方法参数内设置忽略大小写

选择匹配符

符号含义示例解释
|或者的意思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

 

常用分组构造形式说明
(?:pattern)匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,常用来代替我们的或( | )语句。
(?=pattern)

它是一个非捕获匹配(正向预查)。例如 "Windows (?=95|98|NT|2000)" 匹配 "Windows 2000"中的 "Windows",但不匹配 "Windows 3.1"中的 "Windows'。

"(?=95|98|NT|2000)":正向预查,用于确定在匹配 "Windows" 后面的字符串是 "95"、"98"、"NT" 或者 "2000"。它使用了竖线字符 "|" 来表示 "或" 的关系,即满足其中一个条件即可。注意,这个预查不会消费输入字符串,也不会将 "95"、"98"、"NT" 或者 "2000" 匹配结果保存到匹配结果中。
因此,这个正则表达式可以匹配"Windows95"、"Windows98"、"WindowsNT" 和"Windows2000",但不会匹配 "WindowsXP" 或者"Windows10"。它可以用于查找包含特定版本的 "Windows" 字符串,用于特定的匹配需求。

(?!attern)它也是一个非捕获匹配(负向预查)。假设有一个正则表达式 (?!abc),它表示匹配任意一个不以 "abc" 结尾的字符串。例如 "Windows (?=95|98|NT|2000)" 匹配 "Windows XP"中的 "Windows",但不匹配 "Windows 2000"中的 "Windows'。

正向预查 

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"同样不会被保存到结果。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/34058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

认识vite

一.了解vite的不同版本的更新 vite1版本是基于vue项目的&#xff0c;无法跨框架使用vite2可以跨框架&#xff08;vue2&#xff0c;vue3&#xff0c;react&#xff09;vite3模板变更&#xff1b;vite cli优化&#xff1b;import.meta.glob API变化&#xff1b;其他vite4主版本主…

Django框架-使用celery(一):django使用celery的通用配置,不受版本影响

目录 一、依赖包情况 二、项目目录结构 2.1、怎么将django的应用创建到apps包 三、celery的配置 2.1、celery_task/celery.py 2.2、celery_task/async_task.py 2.3、celery_task/scheduler_task.py 2.4、utils/check_task.py 四、apps/user中配置相关处理视图 4.1、基本…

【数据结构】复杂度

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;数据结构 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、什么是数据结构 二、什么是算法 三、算法的效率 四、时间复杂度 4.…

k8s基础

k8s基础 文章目录 k8s基础一、k8s组件二、k8s组件作用1.master节点2.worker node节点 三、K8S创建Pod的工作流程&#xff1f;四、K8S资源对象1.Pod2.Pod控制器3.service && ingress 五、K8S资源配置信息六、K8s部署1.K8S二进制部署2.K8S kubeadm搭建 七、K8s网络八、K8…

人大金仓三大兼容:Oracle迁移无忧

企业级应用早期的架构模式是C/S&#xff08;Client/Server&#xff09;模式&#xff0c;Client做人机交互逻辑的呈现&#xff0c;Sever做业务计算逻辑的实现。这就类似餐馆的运作模式&#xff0c;Client是前台的服务员提供点菜和上菜服务&#xff0c;而Server则是后厨完成菜品的…

设计模式之工厂方法模式(FactoryMethod)

一、概述 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。 二、适用性 1.当一个类不知道它所必须创建的对象的类的时候。 2.当一个类希望由它的子类来指定它所创建的对象的时候。 3.当类将创建对象的职责委…

vue生命周期解析

Vue.js 是一个流行的前端 JavaScript 框架&#xff0c;它提供了一种用于构建用户界面的渐进式方法。Vue 组件的生命周期钩子函数是一些特定的函数&#xff0c;它们在组件不同阶段被自动调用&#xff0c;可以让你在这些阶段执行特定的逻辑。下面是 Vue 组件的生命周期钩子函数以…

【Spring】核心容器——Setter注入

1、引入 首先引入Spring框架依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.6.RELEASE</version> </dependency> 在dao层和service层分别准备两个接口以及他…

Stable Diffuion webui Mac版本安装过程

系统环境 操作系统&#xff1a;MacOS Ventura13.5 芯片&#xff1a;Apple M2 Max Python: 3.10 安装前置准备 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git注意事项&#xff1a;修改源码内全部 git clone 链接&#xff0c;设置代理 https://ghpr…

26 | 谷歌应用APP数据分析

基于kaggle公开数据集,对谷歌应用市场的APP情况进行数据探索和分析。 from kaggle: https://www.kaggle.com/lava18/google-play-store-apps 分析思路: 0、数据准备 1、数据概览 2、种类对Rating的影响 3、定价策略 4、因素相关性分析 5、用户评价 6、总结 0、数据准备 (…

Fast SAM与YOLOV8检测模型一起使用实现实例分割以及指定物体分割

Fast SAM与YOLOV8检测模型一起使用 部分源代码在结尾处可获取 晓理紫 1 使用场景 实例分割数据集的获取要比检测数据的获取更加困难&#xff0c;在已有检测模型不想从新标注分割数据进行训练但是又想获取相关物体的mask信息以便从像素级别对物体进行操作&#xff0c;这时就可以…

学习内容散记

git下载网址 &#xff1a;https://registry.npmmirror.com/binary.html?pathgit-for-windows/ error: remote origin already exists 如果你clone下来一个别人的仓库&#xff0c;在此基础上完成你的代码&#xff0c;推送到自己的仓库可能遇到如下问题&#xff1a; error: r…

uniapp开发(由浅到深)

文章目录 1. 项目构建1.1 脚手架构建1.2 HBuilderX创建 uni-app项目步骤&#xff1a; 2 . 包依赖2.1 uView2.2 使用uni原生ui插件2.3 uni-modules2.4 vuex使用 3.跨平台兼容3.1 条件编译 4.API 使用4.1 正逆参数传递 5. 接口封装6. 多端打包3.1 微信小程序3.2 打包App3.2.1 自有…

PHP“牵手”京东商品详情数据获取方法,京东商品详情API接口申请指南

京东详情接口 API 是淘宝开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取淘宝商品的详细信息&#xff0c;包括商品的标题、描述、图片等信息。在淘宝电商平台的开发中&#xff0c;京东详情接口 API 是非常常用的 API&#xff0c;因此本文将详细介绍京东详情接口 …

VS+QT+Opencv使用YOLOv4对视频流进行目标检测

对单张图像的检测&#xff0c;请参考&#xff1a;https://blog.csdn.net/qq_45445740/article/details/109659938 #include <fstream> #include <sstream> #include <iostream> #include <opencv2/dnn.hpp> #include <opencv2/imgproc.hpp> #inc…

支付整体架构

5.4 支付的技术架构 架构即未来&#xff0c;只有建立在技术架构设计良好的体系上&#xff0c;支付机构才能有美好的未来。如果支付的技术体系在架构上存在问题&#xff0c;那么就没有办法实现高可用性、高安全性、高效率和水平可扩展性。 总结多年来在海内外支付机构主持和参与…

C语言之位运算

一、什么是位运算 所谓位运算是指进行二进制位的运算 在系统软件中&#xff0c;常要处理二进位的问题 例如&#xff0c;将一个存储单元中的各二进位左移或右移一位&#xff0c;两个数按位相加等 二、位运算符和位运算 1、按位与 运算符(&) 参加运算的两个数据&#xff…

php 常用调试方式

要在PHP命令行中配置Xdebug&#xff0c;您需要完成以下步骤&#xff1a; 安装Xdebug扩展&#xff1a;首先&#xff0c;确保已经安装了Xdebug扩展。您可以通过在终端中运行php -m来检查是否安装了Xdebug扩展。如果没有安装&#xff0c;您可以按照官方文档或适用于您所使用的操作…

python正则表达式详解笔记,python正则表达式教学

正则表达式 正则表达式是一个特殊的字符序列&#xff0c;计算机科学的一个概念。通常被用来检索、替换那些符合某个模式(规则)的文本。 许多程序设计语言都支持利用正则表达式进行字符串操作。在Python中需要通过正则表达式对字符串进行匹配的时候&#xff0c;可以使用re模块…

Exploiting Proximity-Aware Tasks for Embodied Social Navigation 论文阅读

论文信息 题目&#xff1a;Exploiting Proximity-Aware Tasks for Embodied Social Navigation 作者&#xff1a;Enrico Cancelli&#xff0c; Tommaso Campari 来源&#xff1a;arXiv 时间&#xff1a;2023 Abstract 学习如何在封闭且空间受限的室内环境中在人类之间导航&a…