Java正则表达式以及Pattern和Matcher类详解

2024-04-14 15:18

本文主要是介绍Java正则表达式以及Pattern和Matcher类详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

正则表达式

一、概述

用来描述或者匹配一系列符合某个语句规则的字符串

二、单个符号

1、英文句点.符号:匹配单个任意字符。

表达式t.o可以匹配:tnot#oteo等等。不可以匹配:tnnotoTnot正o等。
2、中括号[]:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。

表达式:t[abcd]n 只可以匹配:tantbntcntdn。不可以匹配:thntabntn等。
3、| 符号。相当与“或”,可以匹配指定的字符,但是也只能选择其中一项进行匹配。

表达式:t(a|b|c|dd)n 只可以匹配:tantbntcntddn。不可以匹配taantntabcn等。
4、表示匹配次数的符号

在这里插入图片描述

表达式:[0—9]{3}\—[0-9]{2}\—[0-9]{3} 的匹配格式为:999—99—999因为符号在正则表达式中有特殊的含义,它表示一个范围,所以在前面加转义字符\

5、^符号:匹配输入字符的开始位置。如果用在方括号内,^表示不想匹配的字符。

表达式:[^x] 第一个字符不能是x
6、\S符号:非空字符
7、\s符号:空字符,只可以匹配一个空格、制表符、回车符、换页符,不可以匹配自己输入的多个空格。
8、\r符号:空格符,与\n、\tab相同

在这里插入图片描述

三、元字符及其在正则表达式上下文中的行为

元字符在正则表达式中的行为
\将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 \n\r之后的位置
$匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 \n\r之前的位置
*匹配前面的子表达式零次或多次,*等价于{0,}
+匹配前面的子表达式一次或多次,+ 等价于 {1,}
?匹配前面的子表达式零次或一次,? 等价于 {0,1}
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {m,n}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
{n}n 是一个非负整数,匹配确定的n 次
{n,}n 是一个非负整数,至少匹配n 次
{m,n}m 和 n 均为非负整数,其中m <= n。最少匹配 m 次且最多匹配 n 次。在逗号和两个数之间不能有空格
.匹配除 \n之外的任何单个字符。要匹配包括 \n 在内的任何字符,请使用像 [.\n]的模式
(pattern)匹配pattern 并捕获这一匹配。获取匹配结果以后可以用于分组。
(?:pattern)匹配pattern 但不捕获匹配结果,也就是说这是一个非捕获匹配,不进行存储供以后使用
(?=pattern)正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用
(?!pattern)负向预查,与(?=pattern)作用相反
x|y匹配 xy
[xyz]字符集合,匹配[]里面的字符,即xyz
[^xyz]否定字符集合,匹配[]之外的字符,比如abc
[a-z]字符范围,匹配指定范围内的任意字符,如abc
[^a-z]否定字符范围,匹配任何不在指定范围内的任意字符
\b匹配一个单词边界,也就是指单词和空格间的位置
\B匹配非单词边界
\cx匹配由x指明的控制字符
\d匹配一个数字字符,等价于 [0-9]
\D匹配一个非数字字符,等价于 [^0-9]
\f匹配一个换页符。等价于 \x0c\cL
\n匹配一个回车符,等价于 \x0d\cM
\s匹配任何空白字符,包括空格、制表符、换页符等等,等价于[ \f\n\r\t\v]
\S匹配任何非空白字符,等价于 [^ \f\n\r\t\v]
\t匹配一个制表符,等价于 \x09\cI
\v匹配一个垂直制表符,等价于 \x0b\cK
\w匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
\W匹配任何非单词字符,等价于 [^A-Za-z0-9_]

四、常用正则表达式整理

  • 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
  • 匹配空行的正则表达式:\n[\s| ]*\r
  • 匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
  • 匹配首尾空格的正则表达式:(^\s*)|(\s*$)
  • 匹配IP地址的正则表达式:/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //
  • 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
  • 匹配网址URL的正则表达式:http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
  • sql语句:^(select|drop|delete|create|update|insert).*$
  • 非负整数:^\d+$
  • 正整数:^[0-9]*[1-9][0-9]*$
  • 非正整数:^((-\d+)|(0+))$
  • 负整数:^-[0-9]*[1-9][0-9]*$
  • 整数:^-?\d+$
  • 非负浮点数:^\d+(\.\d+)?$
  • 正浮点数:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
  • 非正浮点数:^((-\d+\.\d+)?)|(0+(\.0+)?))$
  • 负浮点数:^(-((正浮点数正则式)))$
  • 英文字符串:^[A-Za-z]+$
  • 英文大写串:^[A-Z]+$
  • 英文小写串:^[a-z]+$
  • 英文字符数字串:^[A-Za-z0-9]+$
  • 英数字加下划线串:^\w+$
  • E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$
  • URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
  • 邮政编码:^[1-9]\d{5}$
  • 电话号码:^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$
  • 手机号码:^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$
  • 双字节字符(包括汉字在内):^\x00-\xff
  • 匹配首尾空格:(^\s*)|(\s*$)
  • 提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
  • 提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
  • 提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
  • 提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)
  • 提取信息中的中国手机号码:(86)*0*13\d{9}
  • 提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}
  • 提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}
  • 提取信息中的中国邮政编码:[1-9]{1}(\d+){5}
  • 提取信息中的浮点数(即小数):(-?\d*)\.?\d+
  • 提取信息中的任何数字 :(-?\d*)(\.\d+)?
  • 电话区号:/^0\d{2,3}$/
  • 腾讯QQ号:^[1-9]*[1-9][0-9]*$
  • 帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  • 中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$

Pattern和Matcher类详解

概述

  • Pattern(模式)类的作用在于编译正则表达式后创建一个匹配模式
  • Matcher(匹配)类使用Pattern实例提供的模式信息对正则表达式进行匹配

Pattern类

常用方法及介绍

  • Pattern complie(String regex)

​ 由于Pattern的构造函数是私有的,不可以直接创建,所以通过静态方法compile(String regex)方法来创建,将给定的正则表达式编译并赋予给Pattern类。

  • String pattern()

    返回正则表达式的字符串形式,其实就是返回Pattern.complile(String regex)的regex参数

@Test
public void testPattern() {String regex = "\\?|\\*";Pattern pattern = Pattern.compile(regex);String patternStr = pattern.pattern();//返回\?\*System.out.println(patternStr);
}
  • Pattern compile(String regex, int flags)

​ 功能和compile(String regex)相同,不过增加了flag参数

  • int flags()

    返回当前Pattern的匹配flag参数

    flag参数用来控制正则表达式的匹配行为,可取值范围如下:

Pattern.CANON_EQ 当且仅当两个字符的”正规分解(canonical decomposition)”都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式”a\u030A”会匹配”?”。默认情况下,不考虑”规范相等性(canonical equivalence)”。

Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。要想对Unicode字符进行大小不明感的匹 配,只要将UNICODE_CASE与这个标志合起来就行了。

Pattern.COMMENTS(?x) 在这种模式下,匹配时会忽略(正则表达式里的)空格字符(译者注:不是指表达式里的”\s”,而是指表达式里的空格,tab,回车之类)。注释从#开始,一直到这行结束.可以通过嵌入式的标志来启用Unix行模式。

Pattern.DOTALL(?s)在这种模式下,表达式’.’可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式’.’不匹配行的结束符。

Pattern.MULTILINE(?m)在这种模式下,’^’和’ ’ 分 别 匹 配 一 行 的 开 始 和 结 束 。 此 外 , ’ ’ 仍 然 匹 配 字 符 串 的 开 始 , ’ ’分别匹配一行的开始和结束。此外,’^’仍然匹配字符串的开始,’ ’也匹配字符串的结束.默认情况下,这两个表达式仅仅匹配字符串的开始和结束。

Pattern.UNICODE_CASE(?u) 在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不明感的匹配。默认情况下,大小写不敏感的匹配只适用于US-ASCII字符集。

Pattern.UNIX_LINES(?d) 在这个模式下,只有’\n’才被认作一行的中止,并且与’.’,’^’以及’$’进行匹配。

  • Matcher matcher(CharSequence input)

​ 对指定输入的字符串创建一个Matcher对象

@Test
public void testMatcher() {Pattern pattern = Pattern.compile("\\?{2}");Matcher matcher = pattern.matcher("??");boolean matches = matcher.matches();// trueSystem.out.println(matches);
}
  • String[] split(CharSequence input)

    分割字符串

  • String[] split(CharSequence input, int limit)
    功能和String[] split(CharSequence input)相同,增加参数limit目的在于要指定分割的段数

@Test
public void testSplit() {String regex = "\\?|\\*";Pattern pattern = Pattern.compile(regex);String[] splitStr = pattern.split("123?123*456*456");//123 123 456 456System.out.println(splitStr);String[] splitStr1 = pattern.split("123?123*456*456", 2);//123 123*456*456System.out.println(splitStr1);
}
  • boolean matches()

​ 编译给定的正则表达式并且对输入的字串以该正则表达式为模开展匹配。该方法适合于该正则表达式只会使用一次的情况,也就是只进行一次匹配工作,因为这种情况下并不需要生成一个Matcher实例。

@Test
public void testMatches() {String regex = "\\?|\\*";Pattern pattern = Pattern.compile(regex);boolean matches = pattern.matches(regex, "?");//返回trueSystem.out.println(matches);
}

Matcher类

常用方法及介绍

  • boolean matches()

​ 最常用方法:尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值。

@Test
public void testMatcherMatches() {Pattern pattern = Pattern.compile("\\?{2}");Matcher matcher = pattern.matcher("??");boolean matches = matcher.matches();//trueSystem.out.println(matches);matcher = pattern.matcher("?");matches = matcher.matches();//falseSystem.out.println(matches);
}
  • boolean lookingAt()

​ 对前面的字符串进行匹配,只有匹配到的字符串在最前面才会返回true

@Test
public void testLookingAt() {Pattern p = Pattern.compile("\\d+");Matcher m = p.matcher("22bb23");boolean match = m.lookingAt();//trueSystem.out.println(match);m = p.matcher("bb2233");match= m.lookingAt();System.out.println(match);//false
}
  • boolean find()

​ 扫描输入序列以查找与该模式匹配的下一个子序列。对字符串进行匹配,匹配到的字符串可以在任何位置

@Test
public void testFind() {Pattern p = Pattern.compile("\\d+");Matcher m = p.matcher("22bb23");m.find();// 返回trueMatcher m2 = p.matcher("aa2223");m2.find();// 返回trueMatcher m3 = p.matcher("aa2223bb");m3.find();// 返回trueMatcher m4 = p.matcher("aabb");m4.find();// 返回false
}
  • int start()

​ 返回当前匹配到的字符串在原目标字符串中的位置

  • int end()

​ 返回当前匹配的字符串的最后一个字符在原目标字符串中的索引位置

  • String group()

​ 返回匹配到的子字符串

@Test
public void testMore() {Pattern p = Pattern.compile("\\d+");Matcher m = p.matcher("aa22bb23");m.find();int start = m.start();//2String group = m.group();//22int end = m.end();//4System.out.println(start);System.out.println(group);System.out.println(end);m.find();start = m.start();//6group = m.group();//23end = m.end();//8System.out.println(start);System.out.println(group);System.out.println(end);
}
package org.zpli.demo;import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.junit.Test;/*** created at 2022/4/22 2:56 下午** @author somnuszpli*/
public class RegexTest {@Testpublic void test1() {String inputStr = "http://localhost:8080/index/marketplaces/80000/pages/helloworld";String regex = ".*/index(?:/miniProg)?/(?:industrySites|marketplaces)?/(\\d+)/pages/([^/]+)";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(inputStr);while (matcher.find()) {System.out.println(matcher.group(1));}}@Testpublic void testPattern() {String regex = "\\?|\\*";Pattern pattern = Pattern.compile(regex);String patternStr = pattern.pattern();//返回\?\*System.out.println(patternStr);}@Testpublic void testMatcher() {Pattern pattern = Pattern.compile("\\?{2}");Matcher matcher = pattern.matcher("??");boolean matches = matcher.matches();// trueSystem.out.println(matches);}@Testpublic void testSplit() {String regex = "\\?|\\*";Pattern pattern = Pattern.compile(regex);String[] splitStr = pattern.split("123?123*456*456");//123 123 456 456System.out.println(splitStr);String[] splitStr1 = pattern.split("123?123*456*456", 2);//123 123*456*456System.out.println(splitStr1);}@Testpublic void testMatches() {String regex = "\\?|\\*";Pattern pattern = Pattern.compile(regex);boolean matches = pattern.matches(regex, "?");//返回trueSystem.out.println(matches);}@Testpublic void testMatcherMatches() {Pattern pattern = Pattern.compile("\\?{2}");Matcher matcher = pattern.matcher("??");boolean matches = matcher.matches();//trueSystem.out.println(matches);matcher = pattern.matcher("?");matches = matcher.matches();//falseSystem.out.println(matches);}@Testpublic void testLookingAt() {Pattern p = Pattern.compile("\\d+");Matcher m = p.matcher("22bb23");boolean match = m.lookingAt();//trueSystem.out.println(match);m = p.matcher("bb2233");match = m.lookingAt();System.out.println(match);//false}@Testpublic void testFind() {Pattern p = Pattern.compile("\\d+");Matcher m = p.matcher("22bb23");m.find();// 返回trueMatcher m2 = p.matcher("aa2223");m2.find();// 返回trueMatcher m3 = p.matcher("aa2223bb");m3.find();// 返回trueMatcher m4 = p.matcher("aabb");m4.find();// 返回false}@Testpublic void testMore() {Pattern p = Pattern.compile("\\d+");Matcher m = p.matcher("aa22bb23");m.find();int start = m.start();//2String group = m.group();//22int end = m.end();//4System.out.println(start);System.out.println(group);System.out.println(end);m.find();start = m.start();//6group = m.group();//23end = m.end();//8System.out.println(start);System.out.println(group);System.out.println(end);}}

这篇关于Java正则表达式以及Pattern和Matcher类详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903328

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置