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

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件