java正则表达式教程

ops/2024/9/23 11:54:16/

什么是正则表达式

正则表达式是一种用来描述字符串模式的语法。在 Java 中,正则表达式通常是一个字符串,它由普通字符(例如字母、数字、标点符号等)和特殊字符(称为元字符)组成。这些特殊字符可以表示一些模式,例如匹配数字、字母、空格等。

正则表达式的作用:

正则表达式在 Java 中被广泛应用于字符串处理中,主要用于以下几个方面:

  1. 查找匹配的文本:可以使用正则表达式在文本中查找特定的模式或子字符串。

  2. 验证输入的格式:可以使用正则表达式验证输入字符串是否符合特定的格式,例如电子邮件地址、手机号码等。

  3. 替换匹配的文本:可以使用正则表达式替换文本中匹配的部分为指定的字符串。

  4. 分割字符串:可以使用正则表达式将字符串分割成多个部分,例如根据逗号、空格等字符进行分割。

 正则表达式的优缺点:

优点:
  1. 灵活性正则表达式提供了一种灵活的方式来描述字符串模式,可以精确地匹配各种复杂的模式,从而实现灵活的文本处理和匹配需求。

  2. 强大的模式匹配能力正则表达式支持各种模式匹配操作,包括查找、替换、验证等,可以满足各种文本处理需求。

  3. 广泛应用正则表达式在各种编程语言和平台上都得到广泛支持和应用,是一种通用的文本处理工具。

  4. 表达能力强正则表达式可以使用各种元字符和特殊语法来表达复杂的字符串模式,具有很强的表达能力。

缺点:
  1. 复杂性正则表达式的语法相对复杂,学习曲线较陡,对于初学者来说可能需要一些时间和练习才能掌握。

  2. 可读性差:由于正则表达式的语法较为紧凑和晦涩,编写和阅读正则表达式可能比较困难,尤其是对于复杂的正则表达式

  3. 性能:对于复杂的正则表达式模式和大量的文本数据,正则表达式的性能可能不如手动编写的字符串处理代码,可能会导致性能问题。

  4. 维护困难:一些复杂的正则表达式可能会变得难以理解和维护,特别是当需要修改或扩展现有的正则表达式时。

组件:

1. 基本匹配
  • 字面字符:直接匹配字符串中的特定字符。例如,cat 会匹配 "cat"。
  • 元字符:拥有特殊意义的字符,用于构建强大的匹配模式,如 .^$*+?|()[]{} 等。

 

正则表达式是一种强大的文本处理工具,用于搜索、匹配和操作字符串。它们基于一套规则来识别字符串中的特定模式。正则表达式广泛应用于编程、数据分析、文本处理等领域。以下是正则表达式的一些基本概念和组件:

2. 特殊字符类
  • .:匹配除换行符外的任意单个字符。
  • \d\w\s:分别匹配任意数字、任意字母或数字(包括下划线),以及任意空白字符(如空格、制表符)。
  • \D\W\S:匹配任意非数字、非单词字符、非空白字符。
3. 字符集
  • [abc]:匹配任何一个列在方括号中的字符(如 'a'、'b' 或 'c')。
  • [^abc]:匹配任何不在方括号中的字符。
4. 边界匹配
  • ^:匹配行的开头。
  • $:匹配行的结尾。
  • \b:匹配单词边界,即单词和空格之间的位置。
  • \B:匹配非单词边界的位置。
5. 量词
  • *:匹配前面的元素零次或多次。
  • +:匹配前面的元素一次或多次。
  • ?:匹配前面的元素零次或一次。
  • {n}:匹配前面的元素恰好 n 次。
  • {n,}:匹配前面的元素至少 n 次。
  • {n,m}:匹配前面的元素至少 n 次,但不超过 m 次。
6. 分组和捕获
  • (xyz):将 'xyz' 视为一个单一的单位,并捕获这部分匹配的文本。这些捕获可以用于后续的操作和引用。
7. 或运算
  • |:匹配两个或多个分支选择,例如 cat|dog 表示匹配 "cat" 或 "dog"。
8. 转义字符
  • \:用于转义特殊字符,使其被解释为字面值,如 \. 就是匹配点号本身,而不是任意字符的元字符。

 

Pattern 类和 Matcher 类:

Java 中的正则表达式通常使用 java.util.regex 包中的类来进行处理,主要包括 Pattern 类和 Matcher 类。Pattern 类表示编译后的正则表达式模式,而 Matcher 类用于执行匹配操作。

Pattern 类

Pattern 类用于表示编译后的正则表达式模式。它提供了一系列静态方法来编译和获取正则表达式模式。主要方法包括:

  1. compile(String regex):

    • 静态方法,用于将给定的正则表达式字符串编译为 Pattern 对象。
    • 返回一个 Pattern 对象,表示编译后的正则表达式模式。
  2. matcher(CharSequence input):

    • 方法用于创建一个 Matcher 对象,用于在给定的输入字符序列中执行匹配操作。
    • 接受一个 CharSequence 参数,可以是 StringStringBuilder 等字符序列。
  3. split(CharSequence input):

    • 方法用于根据正则表达式模式将输入字符序列分割成多个部分。
    • 返回一个 String[] 数组,包含分割后的子字符串。
Matcher 类

Matcher 类是用于执行匹配操作的对象。它提供了一系列方法来执行查找、替换等操作。主要方法包括:

  1. matches():

    • 方法用于尝试将整个输入字符序列与正则表达式模式进行匹配。
    • 返回一个布尔值,表示是否整个输入字符序列与模式匹配。
  2. find():

    • 方法用于在输入字符序列中查找下一个匹配项。
    • 返回 true 表示找到了匹配项,否则返回 false
  3. start() 和 end():

    • start() 方法返回当前匹配的子字符串在原始输入字符序列中的起始位置(包含)。
    • end() 方法返回当前匹配的子字符串在原始输入字符序列中的结束位置(不包含)。
  4. group():

    • 方法用于返回当前匹配的子字符串。
    • 如果在调用 find() 方法之后调用 group() 方法,则返回当前匹配的子字符串。
    • 如果在调用 matches() 方法之后调用 group() 方法,则返回整个输入字符序列。

代码实例: 

1. 验证邮箱地址是否有效
import java.util.regex.*;public class Main {public static void main(String[] args) {String email = "example@example.com";String regex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";boolean isValid = email.matches(regex);if (isValid) {System.out.println("Valid email address");} else {System.out.println("Invalid email address");}}
}
2. 提取文本中的所有链接
import java.util.regex.*;
import java.util.*;public class Main {public static void main(String[] args) {String text = "Visit my website at https://example.com and my blog at http://blog.example.com";String regex = "https?://\\S+";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(text);List<String> links = new ArrayList<>();while (matcher.find()) {links.add(matcher.group());}System.out.println("Links found:");for (String link : links) {System.out.println(link);}}
}
3. 替换字符串中的所有数字
public class Main {public static void main(String[] args) {String text = "Today is 2024-04-16";String replacedText = text.replaceAll("\\d", "*");System.out.println(replacedText); // 输出:Today is ****-**-**}
}


http://www.ppmy.cn/ops/7952.html

相关文章

Linux下:gcc/g++调试工具gdb

gdb 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 gdb mybin debug和release debug debug模式下生成的可执行程序会添加调试信息&#xff0c;所以生成的可执行程序会较大 在使用gcc/g进行编译的时…

pytest教程-27-分布式执行用例插件-pytest-xdist

上一小节我们学习了pytest随机执行用例插件-pytest-random-order&#xff0c;本小节我们讲解一下pytest分布式执行用例插件pytest-xdist。 前言 平常我们手工测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟。如果一个测试人员执行需要10…

微服务架构中的业务完整性验证设计

目录 1.概要设计 1.1 功能完整性与正确性验证 1.2 性能与响应速度验证 1.3 安全性验证 1.4 容错性与恢复能力验证 1.5 监控与日志记录验证 2.技术实现 2.1 测试策略与工具选择 2.2 身份验证与授权 2.3 数据一致性与事务管理 2.4 监控与日志 2.5 容错与恢复 2.6 数…

C 练习实例25

C 练习实例25 题目&#xff1a; 求12!3!...20!的和。 程序分析&#xff1a; 此程序只是把累加变成了累乘。 实例 #include <stdio.h>int main() {int i;long double sum,mix;sum0,mix1;for(i1;i<20;i){mixmix*i;sumsummix;} printf("%Lf\n",sum); }以…

LinkedList和链表

1.ArrayList的缺陷 ArraryList由于底层是一段连续的空间&#xff0c;所以在ArrayList任意位置插入或者删除元素时&#xff0c;就 需要将后续元素往前或者往后搬移&#xff0c;时间复杂度为O(n)&#xff0c;效率比较低&#xff0c;因此ArrayList不适合做任意位置插入和删除比较…

CodeForce[1500-2000]——1950F - 0, 1, 2, Tree!

codeforces刷题日记 题目大意&#xff1a;要求你构造一棵树&#xff0c;树有三种节点&#xff0c;a个节点有两颗子树&#xff0c;b个节点有一颗子树&#xff0c;c给节点是叶子节点&#xff0c;求这样一颗树的最小深度。 思路&#xff1a;首先可以确定这是一颗二叉树&#xff0…

2024年4月22日加密解密验签业务总结

第一版&#xff1a;企业收入区间查询业务接口 {"info": {"_postman_id": "4d25be8f-30a6-4ac2-b920-1130fbd5555b","name": "企业区间数据查询业务接口","schema": "https://schema.getpostman.com/json/c…

RattbitMQ安装

1.RabbitMQ是什么? RabbitMQ是消息队列的一种&#xff0c;生态好&#xff0c;好学习&#xff0c;易于理解&#xff0c;时效性强,支持很多不同语言的客户端,扩展性、可用性都很不错。学习性价比非常高的消息队列&#xff0c;适用于绝大多数中小规模分布式系统。 今天先来简单讲…