当前位置: 首页 > news >正文

java-正则表达式 2

7. 复杂的正则表达式示例(续)

7.1 验证日期格式

以下正则表达式用于验证日期格式,例如YYYY-MM-DD。

import java.util.regex.*;public class RegexExample {public static void main(String[] args) {String[] dates = {"2023-01-01","2023-13-01", // 无效月份"2023-12-32", // 无效日期"2023-02-29", // 非闰年的无效日期"2024-02-29"  // 闰年的有效日期};String patternString = "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$";Pattern pattern = Pattern.compile(patternString);for (String date : dates) {Matcher matcher = pattern.matcher(date);System.out.println(date + ": " + matcher.matches());}}
}

在上述代码中,正则表达式^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$用于验证日期格式。该表达式验证了年份的格式为四位数字,月份为01到12,日期为01到31。

8. 正则表达式的高级用法

8.1 捕获组和非捕获组

捕获组通过圆括号()来定义,非捕获组通过(?:...)来定义。捕获组会保存匹配到的内容,而非捕获组不会。

import java.util.regex.*;public class RegexExample {public static void main(String[] args) {String text = "The price is $123.45";String patternString = "(\\$)(\\d+\\.\\d{2})";Pattern pattern = Pattern.compile(patternString);Matcher matcher = pattern.matcher(text);if (matcher.find()) {System.out.println("Full match: " + matcher.group(0)); // 输出:$123.45System.out.println("Currency symbol: " + matcher.group(1)); // 输出:$System.out.println("Amount: " + matcher.group(2)); // 输出:123.45}}
}

在上述代码中,正则表达式(\\$)(\\d+\\.\\d{2})用于匹配带有货币符号的金额。捕获组用于提取货币符号和金额部分。

8.2 断言

断言是一种零宽度匹配,分为正向断言和负向断言。

  • • 正向断言(?=...):匹配某个位置前面满足特定条件的字符。
  • • 负向断言(?!...):匹配某个位置前面不满足特定条件的字符。
import java.util.regex.*;public class RegexExample {public static void main(String[] args) {String text = "foo123bar";// 正向断言:匹配数字前面是foo的部分String patternString1 = "foo(?=\\d)";Pattern pattern1 = Pattern.compile(patternString1);Matcher matcher1 = pattern1.matcher(text);if (matcher1.find()) {System.out.println("Positive Lookahead: " + matcher1.group()); // 输出:foo}// 负向断言:匹配数字前面不是foo的部分String patternString2 = "(?<!foo)\\d";Pattern pattern2 = Pattern.compile(patternString2);Matcher matcher2 = pattern2.matcher(text);while (matcher2.find()) {System.out.println("Negative Lookbehind: " + matcher2.group());}}
}

在上述代码中,正向断言用于匹配数字前面是foo的部分,负向断言用于匹配数字前面不是foo的部分。

8.3 贪婪、勉强和占有量词

量词用于指定匹配的数量,量词可以是贪婪的、勉强的或占有的。

  • • 贪婪量词(默认):尽可能多地匹配。比如*+?
  • • 勉强量词:尽可能少地匹配。比如*?+???
  • • 占有量词:尽可能多地匹配且不回溯。比如*+++?+
import java.util.regex.*;public class RegexExample {public static void main(String[] args) {String text = "aaaa";// 贪婪量词:尽可能多地匹配String patternString1 = "a+";Pattern pattern1 = Pattern.compile(patternString1);Matcher matcher1 = pattern1.matcher(text);if (matcher1.find()) {System.out.println("Greedy: " + matcher1.group()); // 输出:aaaa}// 勉强量词:尽可能少地匹配String patternString2 = "a+?";Pattern pattern2 = Pattern.compile(patternString2);Matcher matcher2 = pattern2.matcher(text);if (matcher2.find()) {System.out.println("Reluctant: " + matcher2.group()); // 输出:a}// 占有量词:尽可能多地匹配且不回溯String patternString3 = "a++";Pattern pattern3 = Pattern.compile(patternString3);Matcher matcher3 = pattern3.matcher(text);if (matcher3.find()) {System.out.println("Possessive: " + matcher3.group()); // 输出:aaaa}}
}

在上述代码中,分别演示了贪婪量词、勉强量词和占有量词的匹配行为。

9. 正则表达式的性能优化

正则表达式的性能可能会受到匹配模式和输入数据的影响。在编写正则表达式时,应该考虑以下优化策略:

9.1 避免回溯

使用贪婪量词可能导致回溯,从而影响性能。尽量使用勉强量词或占有量词来减少回溯。

9.2 使用预编译的Pattern

避免在每次匹配时都重新编译正则表达式。可以将正则表达式预编译成Pattern对象并重用。

public class RegexExample {private static final Pattern pattern = Pattern.compile("\\d+");public static void main(String[] args) {String text = "123 456 789";Matcher matcher = pattern.matcher(text);while (matcher.find()) {System.out.println("Found: " + matcher.group());}}
}
9.3 优化正则表达式

简化和优化正则表达式,使其更高效。例如,使用字符类而不是单独的字符匹配。

String patternString1 = "[aeiou]"; // 使用字符类
String patternString2 = "a|e|i|o|u"; // 使用单独字符匹配

10. 常见正则表达式示例

10.1 验证IP地址

以下正则表达式用于验证IPv4地址的格式。

import java.util.regex.*;public class RegexExample {public static void main(String[] args) {String[] ips = {"192.168.0.1","255.255.255.255","256.256.256.256", // 无效IP地址"192.168.1.300"   // 无效IP地址};String patternString = "^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$";Pattern pattern = Pattern.compile(patternString);for (String ip : ips) {Matcher matcher = pattern.matcher(ip);System.out.println(ip + ": " + matcher.matches());}}
}

在上述代码中,正则表达式^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$用于验证IPv4地址的格式。

11. 工具和框架中的正则表达式

正则表达式在各种工具和框架中得到了广泛应用。例如:

  • • 文本编辑器和IDE:许多文本编辑器和IDE支持正则表达式搜索和替换。
  • • Web框架:Web框架使用正则表达式进行URL路由和参数验证。
  • • 数据处理工具:正则表达式用于数据清洗和解析。

相关文章:

java-正则表达式 2

7. 复杂的正则表达式示例&#xff08;续&#xff09; 7.1 验证日期格式 以下正则表达式用于验证日期格式&#xff0c;例如YYYY-MM-DD。 import java.util.regex.*;public class RegexExample {public static void main(String[] args) {String[] dates {"2023-01-01&q…...

hadoop常见简单基础面试题

文章目录 hadoop简单基础面试题1. 请说下 HDFS 读写流程2. HDFS 在读取文件的时候&#xff0c;如果其中一个块突然损坏了怎么办3. HDFS 在上传文件的时候&#xff0c;如果其中一个 DataNode 突然挂掉了怎么办4. NameNode 在启动的时候会做哪些操作5.Secondary NameNode 了解吗&…...

泄漏检测(LDAR)在建档和检测过程中造假套路和不规范行为

第一章 建档环节造假和不规范 一、 企业行为&#xff1a; 企业为了节约检测费&#xff0c;采取部分建档&#xff0c;部分密封点检测的行为 二、 第三方检测公司不规范行为&#xff1a; 1、台账信息不准确&#xff0c;密封点命名不准确 &…...

Android CTS环境搭建

CTS即Compatibility Test Suite意为兼容性测试&#xff0c;是Google推出的Android平台兼容性测试机制。其目的是尽早发现不兼容性&#xff0c;并确保软件在整个开发过程中保持兼容性。只有通过CTS认证的设备才能合法的安装并使用Google market等Google应用。 搭建CTS测试环境需…...

比较Zig、Rust和C++

比较Zig、Rust和C这三种编程语言&#xff0c;我们可以从以下几个关键维度来进行&#xff1a; 设计理念 表格 语言 设计理念 Zig 简洁性、模块化、避免常见错误 Rust 内存安全、并发性、性能 C 性能优化、资源控制、可扩展性 内存安全 Zig通过严格的编译时检查、可选…...

路由的params参数,命名路由,路由的params参数,命名路由

上篇我们讲了vue路由的使用 今天我们来讲vue中路由的嵌套&#xff0c;路由的params参数,命名路由 一.路由的params参数 1.配置路由规则&#xff0c;使用children配置项&#xff1a; router:[{path:/about,component:About,},{path:component:Home,//通过children配置子路由c…...

java:CompletableFuture的简单例子

java&#xff1a;CompletableFuture的简单例子 package com.chz.myTest;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.ExecutionException; import java.uti…...

element的table获取当前表格行

需求&#xff1a;验证表格同一行的最低限价不能超过销售定价 思路&#xff1a;先获取当前行table的index&#xff0c;然后在做大小比较 1.局部html <el-table-column label"销售定价(元)" min-width"200px"><template slot"header"&…...

html做一个分组散点图图的软件

在HTML中创建一个分组散点图&#xff0c;可以结合JavaScript库如D3.js或Plotly.js来实现。这些库提供了强大的数据可视化功能&#xff0c;易于集成和使用。下面是一个使用Plotly.js创建分组散点图的示例&#xff1a; 要添加文件上传功能&#xff0c;可以让用户上传包含数据的文…...

【SQL】UNION 与 UNION ALL 的区别

在 SQL 中&#xff0c;UNION 和 UNION ALL 都用于将两个或多个结果集合并为一个结果集&#xff0c;但它们在处理重复数据方面有显著区别。以下是它们的详细区别&#xff1a; 1. UNION UNION 操作符用于合并两个或多个 SELECT 语句的结果集&#xff0c;并自动去除结果集中重复…...

分类判决界面---W-H、H-K算法

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在AI学习笔记&#…...

Python基础教程(三十):math模块

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…...

你只是重新发现了一些东西

指北君关于另外一条思维路径的发现。 "自以为是"的顿悟时刻 有很多时候&#xff0c;我会"自以为是"的发现/发明一些东西。这种"自以为是"的时刻通常还带有一些骄傲自豪的情绪。这种感觉特别像古希腊博学家阿基米德 在苦思冥想如何测量不规则物体…...

【英伟达GPU的挑战者】Groq—AI大模型推理的革命者

目录 引言第一部分&#xff1a;Groq简介第二部分&#xff1a;Groq的特点与优势1、高性能推理加速2、近存计算技术3、专用ASIC芯片设计4、低延迟与高吞吐量5、成本效益分析6、易用性与集成性7、软件与硬件的协同设计 第三部分&#xff1a;Groq的使用指南1、准备工作2、简单使用样…...

Python学习路线

Python学习路线 领取资料 一、Python基础知识 Python入门&#xff1a;了解Python的安装方法、如何运行Python程序以及交互模式的使用&#xff0c;同时学习注释的添加方法。 数据类型&#xff1a;掌握Python中的各种数据类型&#xff0c;包括数字、布尔值、字符串、列表、元…...

C++ std::forward()

在线调试网站&#xff1a; https://wandbox.org/ #include <iostream> #include <thread> #include <mutex> void func(int &&args) {std::cout << args << std::endl; }int main () {int a 10;func(20); …...

常见的8种排序(含代码):插入排序、冒泡排序、希尔排序、快速排序、简单选择排序、归并排序、堆排序、基数排序

时间复杂度O(n^2) 1、插入排序 (Insertion Sort) 从第一个元素开始&#xff0c;该元素可以认为已经被排序&#xff1b;取出下一个元素&#xff0c;在已经排序的元素序列中从后向前扫描&#xff1b;如果该元素&#xff08;已排序&#xff09;大于新元素&#xff0c;将该元素移到…...

go语言day2

使用cmd 中的 go install &#xff1b; go build 命令出现 go cannot find main module 错误怎么解决&#xff1f; go学习-问题记录(开发环境)go: cannot find main module&#xff1b; see ‘go help modules‘_go: no flags specified (see go help mod edit)-CSDN博客 在本…...

vue echarts画多柱状图+多折线图

<!--多柱状图折线图--> <div class"echarts-box" id"multiBarPlusLine"></div>import * as echarts from echarts;mounted() {this.getMultiBarPlusLine() },getMultiBarPlusLine() {const container document.getElementById(multiBar…...

cesium for unity 打包webgl失败,提示不支持

platform webgl is not supported with HDRP use the Vulkan graphics AR instead....

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...