当前位置: 首页 > 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路由和参数验证。
  • • 数据处理工具:正则表达式用于数据清洗和解析。
http://www.lryc.cn/news/379445.html

相关文章:

  • hadoop常见简单基础面试题
  • 泄漏检测(LDAR)在建档和检测过程中造假套路和不规范行为
  • Android CTS环境搭建
  • 比较Zig、Rust和C++
  • 路由的params参数,命名路由,路由的params参数,命名路由
  • java:CompletableFuture的简单例子
  • element的table获取当前表格行
  • html做一个分组散点图图的软件
  • 【SQL】UNION 与 UNION ALL 的区别
  • 分类判决界面---W-H、H-K算法
  • Python基础教程(三十):math模块
  • 你只是重新发现了一些东西
  • 【英伟达GPU的挑战者】Groq—AI大模型推理的革命者
  • Python学习路线
  • C++ std::forward()
  • 常见的8种排序(含代码):插入排序、冒泡排序、希尔排序、快速排序、简单选择排序、归并排序、堆排序、基数排序
  • go语言day2
  • vue echarts画多柱状图+多折线图
  • cesium for unity 打包webgl失败,提示不支持
  • python开发基础——day7 序列类型方法
  • 用java写一个二叉树翻转
  • 数学建模系列(3/4):典型建模方法
  • AI播客下载:Machine Learning Street Talk(AI机器学习)
  • 鱼缸补水器工作原理是什么
  • Linux-Tomcat服务配置到系统服务
  • Python抓取高考网图片
  • Vue配置项data
  • 在IDEA 2024.1.3 (Community Edition)中创建Maven项目
  • 动手学深度学习(Pytorch版)代码实践 -卷积神经网络-28批量规范化
  • Apache Paimon系列之:Append Table和Append Queue