【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
相关文章
|
20天前
|
Java
Java中的抽象类:深入了解抽象类的概念和用法
Java中的抽象类是一种不能实例化的特殊类,常作为其他类的父类模板,定义子类行为和属性。抽象类包含抽象方法(无实现)和非抽象方法。定义抽象类用`abstract`关键字,子类继承并实现抽象方法。抽象类适用于定义通用模板、复用代码和强制子类实现特定方法。优点是提供抽象模板和代码复用,缺点是限制继承灵活性和增加类复杂性。与接口相比,抽象类可包含成员变量和单继承。使用时注意设计合理的抽象类结构,谨慎使用抽象方法,并遵循命名规范。抽象类是提高代码质量的重要工具。
33 1
|
30天前
|
机器学习/深度学习 前端开发 Windows
【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则符号深入解析 )
【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则符号深入解析 )
32 0
|
1月前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
25 0
|
20天前
|
XML 数据可视化 前端开发
java正则表达式
java正则表达式
|
2天前
|
Java 编译器 API
Java基础教程(17)-Java8中的lambda表达式和Stream、Optional
【4月更文挑战第17天】Lambda表达式是Java 8引入的函数式编程特性,允许函数作为参数或返回值。它有简洁的语法:`(parameters) -> expression 或 (parameters) ->{ statements; }`。FunctionalInterface注解用于标记单方法接口,可以用Lambda替换。
|
4天前
|
Java 程序员 编译器
JavaSE&Java8 Lambda 表达式
JavaSE&Java8 Lambda 表达式
|
8天前
|
并行计算 Java 编译器
Java Lambda表达式简介
Java Lambda表达式简介
12 0
|
9天前
|
JSON Java 数据格式
Java QueryWrapper基本用法
Java QueryWrapper基本用法
13 2
|
9天前
|
Java 开发者
探索 Java 的函数式接口和 Lambda 表达式
【4月更文挑战第19天】Java 中的函数式接口和 Lambda 表达式提供了简洁、灵活的编程方式。函数式接口有且仅有一个抽象方法,用于与 Lambda(一种匿名函数语法)配合,简化代码并增强可读性。Lambda 表达式的优点在于其简洁性和灵活性,常用于事件处理、过滤和排序等场景。使用时注意兼容性和变量作用域,它们能提高代码效率和可维护性。
|
12天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【4月更文挑战第16天】本文将介绍Java 8中的两个重要新特性:Lambda表达式和Stream API。Lambda表达式是Java 8中引入的一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁、易读。Stream API是Java 8中引入的一种新的数据处理方式,它允许我们以声明式的方式处理数据,从而使代码更加简洁、高效。本文将通过实例代码详细讲解这两个新特性的使用方法和优势。

热门文章

最新文章