【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
相关文章
|
6天前
|
Java
探索Java中的Lambda表达式
【9月更文挑战第28天】Lambda表达式,这一Java 8引入的轻量级语法结构,为函数式编程提供了强有力的支持。它简化了代码,提高了开发效率,并使得并行处理数据变得异常容易。本文将通过直观的例子和详细的解释,带领读者深入理解Lambda表达式的奥秘,从而在编程实践中更加灵活地运用它们。
|
7天前
|
Java API
探索Java中的Lambda表达式
【9月更文挑战第27天】Lambda表达式,作为Java 8的一大亮点,为我们的编程世界带来了一股清新之风。它以其简洁明了的语法和强大的功能,让我们在处理集合、线程等复杂操作时如鱼得水。本文将带你一探Lambda表达式的奥秘,让你领略到它的魅力所在。
18 6
|
8天前
|
Java API 开发者
探索Java中的Lambda表达式:简洁与强大的代码实践
本文深入探讨Java中Lambda表达式的定义、用法及优势,通过实例展示其如何简化代码、提升可读性,并强调在使用中需注意的兼容性和效率问题。Lambda作为Java 8的亮点功能,不仅优化了集合操作,还促进了函数式编程范式的应用,为开发者提供了更灵活的编码方式。
|
4天前
|
Java 开发者
探索Java中的Lambda表达式:简化你的代码之旅##
【8月更文挑战第62天】 Java 8的发布为开发者带来了诸多新特性,其中最引人注目的无疑是Lambda表达式。这一特性不仅让代码变得更加简洁,还极大地提升了开发的效率。本文将通过实际示例,展示如何利用Lambda表达式来优化我们的代码结构,同时探讨其背后的工作原理和性能考量。 ##
|
5天前
|
Java API 开发者
探索Java中的Lambda表达式
【9月更文挑战第29天】Lambda表达式,在Java编程中,它不仅仅是一种语法糖,更是简化代码、提升效率的利器。本文将通过浅显易懂的语言和实际代码示例,带你走进Lambda的世界,了解其背后的原理和在日常开发中的应用,让你的代码更简洁、更高效。
|
7天前
|
Java API 开发者
探索Java中的Lambda表达式:简化代码,提升效率
【9月更文挑战第27天】在Java 8中引入的Lambda表达式为编程带来了革命性的变化。通过简洁的语法和强大的功能,它不仅简化了代码编写过程,还显著提升了程序的执行效率。本文将深入探讨Lambda表达式的本质、用法和优势,并结合实例演示其在实际开发中的应用。无论你是Java新手还是资深开发者,都能从中获得启发,优化你的代码设计。
|
10天前
|
Java 测试技术
java正则表达式
java正则表达式
23 7
|
9天前
|
Java API
Java中的Lambda表达式及其应用
本文将深入探讨Java中的Lambda表达式,通过简洁易懂的语言和示例代码,帮助读者理解Lambda表达式的定义、优势以及在实际开发中的应用。同时,我们将解析一些常见的使用场景,并展示如何利用Lambda表达式简化代码,提高编程效率。
18 2
|
10天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的探索
【9月更文挑战第24天】本文将深入浅出地介绍Java 8中的重要新特性——Lambda表达式和Stream API,通过实例解析其语法、用法及背后的设计哲学。我们将一探究竟,看看这些新特性如何让Java代码变得更加简洁、易读且富有表现力,同时提升程序的性能和开发效率。
|
10天前
|
分布式计算 Java API
深入解析Java中的Lambda表达式及其应用
本文将深入探讨Java中Lambda表达式的定义、优势及其在实际编程中的应用。通过具体示例,帮助读者更好地理解和使用这一强大的编程工具。
下一篇
无影云桌面