【Java 正则表达式】简单用法,注意点,我学不会正则

简介: 【Java 正则表达式】简单用法,注意点,我学不会正则



这不纯纯天书吗,谁要能学会正则,我真是表示羡慕

另外,此文章采用的纯纯 cv 大法, 到处粘贴,我是不喜欢学正则。。。反人类的语法

Regex 正则表达式

正则表达式(Regex)不仅仅是Java的技术,在任何一门编程语言中都会存在,是一种通用的IT技术,其理念和用法在任何编程语言中基本一致,除了有一些由于语言不同而导致的一些语法不同正则表达式,主要用于匹配(查找 替换 计数)字符串中的数据的,也叫做文本匹配技术。

以下是正则表达式的特点:

  • 灵活性:正则表达式可以匹配各种不同格式的文本,包括数字、字母、符号、空白字符等。
  • 精确性:正则表达式可以精准地匹配指定的文本模式,避免匹配错误或过度匹配。
  • 强大性:正则表达式支持多种操作,如查找、替换、分割等,可以在多种应用场景中使用。
  • 学习成本高:正则表达式的语法相对复杂,需要花费时间学习和理解。

正则表达式的匹配规则

正则表达式(Regex)的匹配规则基于一些特定的语法和符号,可以帮助我们更方便地匹配和查找文本数据。以下是正则表达式的匹配规则

  • 字符类:使用方括号([])表示,用来匹配指定字符集中的任意一个字符。例如,[abc]可以匹配a、b、c中的任意一个字符。
  • 量词:用来指定匹配字符的数量,包括:*(匹配0次或多次)、+(匹配1次或多次)、?(匹配0次或1次)、{n}(匹配n次)、{n,}(匹配n次或多次)和{n,m}(匹配n到m次)。
  • 边界匹配符:用来匹配字符串的边界。包括:^(匹配字符串开头)、$(匹配字符串结尾)和\b(匹配单词边界)。
  • 分组:使用圆括号()表示,用来将多个字符作为一个整体来匹配。
  • 转义字符:使用反斜杠\表示,用来转义具有特殊含义的字符,例如+匹配+字符。
  • 模式修饰符:在正则表达式后面添加特定符号,用来修改匹配规则,例如i(忽略大小写)、g(全局匹配)和m(多行匹配)。

以上是正则表达式的基本匹配规则,使用这些规则可以构建复杂的字符串模式来匹配、搜索、替换和验证文本数据。

正则表达式

匹配任意字符

这个我还是会滴! . 可以匹配任意一个字符, 基于 a.b, 例如 aab, a&b 都可以匹配且返回为true

但是他不能匹配 ab, abc, . 匹配一个字符且仅限一个字符

String regex = "a.b";
System.out.println("abc".matches(regex));//false
System.out.println("a&b".matches(regex));//true
System.out.println("acb".matches(regex));//true
System.out.println("ab".matches(regex));//false
System.out.println("a&&b".matches(regex));//false

匹配数字

如果我们只想匹配 0 ~ 9 这样的数字,可以用 \d 匹配

String regex = "Demo\\d\\d\\.java";
System.out.println("Demo11.java".matches(regex));//true
System.out.println("Demo123.java".matches(regex));//false
System.out.println("Demo.java".matches(regex));//false

匹配常用字符

用 \w 可以匹配一个字母、数字或下划线,w的意思是word。

它不能匹配 “java#” , "java " ,因为 \w 不能匹配 # 、空格等字符

String regex = "java\\w";
System.out.println("java_".matches(regex));//true
System.out.println("javac".matches(regex));//true
System.out.println("java".matches(regex));//false
System.out.println("java!".matches(regex));//false

匹配空格字符

用 \s 可以匹配一个空格字符,注意空格字符不但包括空格 " “`,还包括tab字符(在Java中用制表符”\t"表示)。

String regex = "a\\sc";
System.out.println("a c".matches(regex));//true
System.out.println("a  c".matches(regex));//false
System.out.println("ac".matches(regex));//false
System.out.println("a   c".matches(regex));//false
System.out.println("a\tc".matches(regex));//true

匹配非数字

\d 可以匹配 0-9 的数字, 则\D可以匹配非数字

例如, 00\D 可以匹配:

  • “00A” ,因为 \D 可以匹配非数字字符 A ;
  • “00#” ,因为 \D 可以匹配非数字字符 # 。

00\d 可以匹配的字符串 “007” , “008” 等, 00\D 是不能匹配的。

类似的:

  • \d任意一个数字 \D任意一个非数字;
  • \s任意一个空格 \S任意一个非空格;
  • \w任意一个数字字母下划线 \W任意一个非数字字母下划线

重复匹配

我们用 \d 可以匹配一个数字,例如, A\d 可以匹配 “A0” , “A1” ,如果要匹配多个数字,比如 “A380” ,怎么办?

修饰符 * 可以匹配任意个字符,包括0个字符。我们用 A\d* 可以匹配:

A :因为 \d* 可以匹配0个数字;

A0 :因为 \d* 可以匹配1个数字 0 ;

A380 :因为 \d* 可以匹配多个数字 380 。

String regex1 = "A*";  //连续0个或多个A
System.out.println("A".matches(regex1));
System.out.println("Animal".matches(regex1));
System.out.println("A123123".matches(regex1));
System.out.println("AAAAAAA".matches(regex1));
String regex2 = "A\\d*";
System.out.println("A12313123123".matches(regex2));
System.out.println("A".matches(regex2));
System.out.println("Aasdhjahsjdk1123".matches(regex2));
System.out.println("".matches(regex2));

修饰符 + 可以匹配至少一个字符。我们用 A\d+ 可以匹配:

A0 :因为 \d+ 可以匹配1个数字 0 ;

A380 :因为 \d+ 可以匹配多个数字 380 。

但它无法匹配 “A” ,因为修饰符 + 要求至少一个字符。

String regex = "A\\d+";
System.out.println("A12313123123".matches(regex));
System.out.println("A".matches(regex)); // false
System.out.println("Aasdhjahsjdk1123".matches(regex));
System.out.println("".matches(regex));

修饰符 ? 可以匹配0个或一个字符。我们用 A\d? 可以匹配:

A :因为 \d? 可以匹配0个数字;

A0 :因为 \d+ 可以匹配1个数字 0 。

但它无法匹配 “A33” ,因为修饰符 ? 超过1个字符就不能匹配了。

String regex = "A\\d?";
System.out.println("A12313123123".matches(regex));
System.out.println("A".matches(regex));
System.out.println("A1".matches(regex));
System.out.println("".matches(regex));

如果我们想精确指定n个字符怎么办?用修饰符 {n} 就可以。 A\d{3} 可以精确匹配:

A380 :因为 \d{3} 可以匹配3个数字 380 。

如果我们想指定匹配n~m个字符怎么办?用修饰符 {n,m} 就可以。 A\d{3,5} 可以精确匹配:

A380 :因为 \d{3,5} 可以匹配3个数字 380 ;

A3800 :因为 \d{3,5} 可以匹配4个数字 3800 ;

A38000 :因为 \d{3,5} 可以匹配5个数字 38000 。

如果没有上限,那么修饰符 {n,} 就可以匹配至少n个字符。

System.out.println("A123".matches("A\\d{3}"));
System.out.println("A123".matches("A\\d{3,5}"));
System.out.println("A12345".matches("A\\d{3,5}"));
System.out.println("A123".matches("A\\d{4,}"));

比如匹配一个座机号 010-33167854 3个数字-8个数字 \d{3}-\d{8}。

System.out.println("010-12345678".matches("\\d{3}\\-\\d{8}"));
System.out.println("0101-2345678".matches("\\d{3}\\-\\d{8}"));

正则表达式字符含义

正则表达式       规则              可以匹配
A               固定字符A           "A"
\u548c          指定Unicode字符     "和"
.               任意一个字符         "a" "1" " "
\d              一个数字字符0~9      "0"~"9"
\w              一个数字或字母或下划线
\W              非\w
\D              非\d
\s              一个空格字符(\t ' ')
\S              非\s
A*              A有任意个           "" "A" "AA" "AAA"
A+              A至少一个           "A" "AA" "AAA"
A?              A0个或1个           "" "A"
A{3}            A出现3次            "AAA"
A{3,5}          A出现3~5次         "AAA"  "AAAA"  "AAAAA"
A{2,}           A出现至少2次       "AA"  "AAA"  "AAAA"
A{0,3}          A出现0~3次         ""  "A"  "AA"  "AAA"

一些常用到的正则

匹配整数

String regex = "^\\d+$";
String num = "12345";
boolean isMatched = num.matches(regex);
System.out.println(isMatched); // true

匹配浮点数

String regex = "^\\d+(\\.\\d+)?$";
String num = "3.14";
boolean isMatched = num.matches(regex);
System.out.println(isMatched); // true

匹配汉字

String regex = "^[\\u4e00-\\u9fa5]+$";
String chinese = "中国";
boolean isMatched = chinese.matches(regex);
System.out.println(isMatched); // true

匹配日期格式(yyyy-MM-dd)

String regex = "^\\d{4}-\\d{2}-\\d{2}$";
String date = "2023-05-14";
boolean isMatched = date.matches(regex);
System.out.println(isMatched); // true

匹配邮政编码

String regex = "^\\d{6}$";
String postalCode = "100101";
boolean isMatched = postalCode.matches(regex);
System.out.println(isMatched); // true

匹配手机号码

String regex = "^1[3456789]\\d{9}$";
String phoneNumber = "13612345678";
boolean isMatched = phoneNumber.matches(regex);
System.out.println(isMatched); // true

匹配电子邮件地址

String regex = "^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
String email = "example@example.com";
boolean isMatched = email.matches(regex);
System.out.println(isMatched); // true

匹配URL地址

String regex = "^((https?|ftp|file)://)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*/?$";
String url = "http://www.example.com/index.html";
boolean isMatched = url.matches(regex);
System.out.println(isMatched); // true
相关文章
|
5天前
|
Java
探索Java中的Lambda表达式
【10月更文挑战第37天】本文将带你深入理解Java的Lambda表达式,从基础语法到高级特性,通过实例讲解其在函数式编程中的应用。我们还将探讨Lambda表达式如何简化代码、提高开发效率,并讨论其在实际项目中的应用。
|
8天前
|
Java API
Java中的Lambda表达式与函数式编程####
【10月更文挑战第29天】 本文将深入探讨Java中Lambda表达式的实现及其在函数式编程中的应用。通过对比传统方法,我们将揭示Lambda如何简化代码、提高可读性和维护性。文章还将展示一些实际案例,帮助读者更好地理解和应用Lambda表达式。 ####
|
8天前
|
JSON 自然语言处理 Java
这款轻量级 Java 表达式引擎,真不错!
AviatorScript 是一个高性能、轻量级的脚本语言,基于 JVM(包括 Android 平台)。它支持数字、字符串、正则表达式、布尔值等基本类型,以及所有 Java 运算符。主要特性包括函数式编程、大整数和高精度运算、完整的脚本语法、丰富的内置函数和自定义函数支持。适用于规则判断、公式计算、动态脚本控制等场景。
|
12天前
|
Java API 开发者
Java中的Lambda表达式与函数式编程####
在Java的演变过程中,Lambda表达式和函数式编程的引入无疑是一次重大的飞跃。本文将深入探讨Lambda表达式的定义、用法及优势,并结合实例说明如何在Java中利用Lambda表达式进行函数式编程。通过对比传统编程方式,揭示Lambda表达式如何简化代码、提高开发效率和可维护性。 ####
|
21天前
|
自然语言处理 安全 Java
Aviator Java 表达式引擎
AviatorScript 是一门高性能、轻量级寄宿于 JVM 之上的脚本语言。
40 10
|
18天前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
22天前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
|
23天前
|
移动开发 Java Windows
Java 匹配\r 和 \n 的正则表达式如何编写
【10月更文挑战第19天】Java 匹配\r 和 \n 的正则表达式如何编写
72 3
|
22天前
|
Java API
[Java]Lambda表达式
本文主要介绍了Java中的Lambda表达式,包括其优化匿名内部类的方式、使用规范、内置函数式接口及方法引用等内容。文章详细解析了Lambda的基础语法、参数列表、方法体的简化规则,以及如何利用Lambda优化代码。此外,还探讨了Lambda的作用域和引用规则,强调了对局部变量、成员变量和常量的访问限制,旨在帮助读者全面理解和掌握Lambda表达式的应用。
13 0
[Java]Lambda表达式
|
1月前
|
Java 程序员 API
Java中的Lambda表达式:简化代码的秘密武器
【10月更文挑战第11天】 在Java编程中,Lambda表达式是一种简洁而强大的工具,它允许我们将函数作为参数传递给其他方法。本文将介绍Lambda表达式的基本概念、使用方法以及在实际项目中的应用案例,帮助你更好地理解和利用这一特性来简化代码。
22 8