java正则【四】Java String.ReplaceAll捕获组用法(正则表达式捕获组及命名捕获组)

本文主要是介绍java正则【四】Java String.ReplaceAll捕获组用法(正则表达式捕获组及命名捕获组),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基础说明

public String replaceAll(String regex, String replacement) 使用replacement替换字符串中和regex匹配的所有子串,regex为正则表达式,源码:

  /** * @since 1.4* @spec JSR-51*/public String replaceAll(String regex, String replacement) {return Pattern.compile(regex).matcher(this).replaceAll(replacement);

请注意区分

  • public String replace(CharSequence target, CharSequence replacement)
  • public String replace(CharSequence target, CharSequence replacement)源码
  /*** 使用replacement替换字符串中所有和target匹配的子串* 从字符串开始到结尾依次替换* 例如:“aaa”.replace("aa","b"),结果为“ba”,而不是“ab”** @since 1.5*/public String replace(CharSequence target, CharSequence replacement) {return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));}

 

从源码可以看出,两者都是使用的Matcher.replaceAll(String replacement)

二、捕获组用法

replaceAll的一般用法就不介绍了,直接说捕获组用法,示例代码

String phone = "18310005432";
phone = phone.replaceAll("(\\d{3})\\d+(\\d{4})", "$1****$2");
System.out.println(phone);// 183****5432

捕获组是正则表达式中的概念,如上例中(\\d{3})\\d+(\\d{4}),一个括号()为一个捕获组,捕获组按左括号先后顺序编号,(\\d{3}) 为1号,(\\d{4})为2号,整个正则表达式为0号捕获组,可以使用$加编号(索引)对捕获组进行引用

jdk 中文API

在这里插入图片描述
英文原版在这里插入图片描述

上文示例代码理解,(\\d{3})\\d+(\\d{4}) 匹配整个字符串,其中捕获组1(\\d{3})匹配到183,捕获组2(\\d{4})匹配到5432,$1****$2$1 是对1组匹配值的引用,$2同理

三、命名捕获组

我们可以给捕获组起名字,方便引用,适用于包含大量捕获组的正则表达式

  • 命名方式:

            (?<NAME>A),捕获组A被命名为NAME,例:(?<n1>\\d{3}),名字仅允许[A-Za-z0-9]

  • 引用

        \k<Name> 正则表达式内部引用前面定义过的捕获组,k大概是back的意思backref(回引),例:(?<char>.{1})\\k<char>*;

        ${Name}在Matcher’s replacement 字符串中引用命名捕获组;

        group(String NAME)Matcher的group方法,返回命名捕获组匹配到的子串;       

  • 用例
String phone = "18310005432";
System.out.println(phone.replaceAll("(?<n1>\\d{3})\\d+(?<n2>\\d{4})", "${n1}****${n2}"));
System.out.println(phone.replaceAll("(?<n1>\\d{3})\\d+(?<n2>\\d{4})", "${n1}****$2"));
System.out.println(phone.replaceAll("(?<n1>\\d{3})\\d+(?<n2>\\d{4})", "${n2}****$2"));

复杂用例

String input = "aabbbccdddef";
String regex = "(?<char>.{1})\\k<char>*";
//Matcher用法
Pattern pattern = Pattern.compile(regex);
Matcher matcher=pattern.matcher(input);
while(matcher.find()) {System.out.println(matcher.group()+":"+matcher.group(0)+":"+matcher.group(1)+":"+matcher.group("char"));
}
//replaceAll
String temp = input.replaceAll(regex, "$0,");
String[] arr = temp.split(",");
System.out.println(java.util.Arrays.toString(arr));


(?<char>.{1})\\k<char>* 理解 (?<char>.{1})匹配一个字符,\\k<char>*零个或多个该字符
group()内部调用的group(0)
group(1)和group(“char”)都是指向第一个捕获组
————————————————
版权声明:本文为CSDN博主「椰汁菠萝」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/suo082407128/article/details/107006609

这篇关于java正则【四】Java String.ReplaceAll捕获组用法(正则表达式捕获组及命名捕获组)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro