java正则表达式

深入java 定义正则表达式 这篇文章总结java1.4之后加入的正则表达式,总结他的使用。更多的源代码请访问我的github:https://github.com/yangsheng20080808/deepIntoJava本文分为3大部分 正则表达式的通用定义规则 正则表达式定义的例子 附加常用的匹配例子 正则表达式的通用定义规则使用正则表达式我们只要关心一个类即可:java.util.regex.Pattern 摘抄自官 阅读详情

目录                              

一、前言

二、正则表达式的使用诉求

三、java.util.regex包

四、java.lang.String实例

五、最短路径实现诉求

六、Java支持的正则表达式功能语法

七、总结

八、参考

 

一、前言                             

  正则表达式作为文本处理的利器,早已成为各大语言的必要装备,但各语言对其的实现程度(功能语法支持程度)和API设计均有所差异,本篇将目光投向java原生类库中提供的正则表达式API—— java.util.regex包 和 java.lang.String实例方法 ,和所支持的功能语法上。

 

二、 正则表达式的使用诉求                    

  正则表达式一般用于处理如下诉求,本篇后续内容将以这些诉求为基础检验相关的原生API是否提供方便有效(code less,do more)的操作方式。

  1. 匹配字符串:全字符串匹配、部分匹配(也就是包含关系)

  2. 替换字符串

  3. 萃取字符串

  4. 拆分字符串

 

三、 java.util.regex包                        

  从jdk1.5开始正则表达式相关API就集中存放在该包下,且为其他类中表达式相关方法提供基础处理能力。

  1.  java.util.regex.Pattern类 :模式类,用于对正则表达式进行编译。

       类方法:

复制代码
/*
 * 对正则表达式进行编译,并返回Pattern实例
 * 入参flag作为表达式属性,启用多个表达式属性时,采用管道符(|)连接多个表达式属性。除了通过入参的方式设置表达式属性,还可以使用嵌入式标识来设置表达式属性,格式为:(?表达式属性1表达式属性2)正则表达式,示例——不区分大小写和全局匹配abcd:(?ig)abcd
 */
Pattern compile(String regex);
Pattern compile(String regex, int flag);

// 字符串完整匹配表达式的快捷方式,内部依然是
// Pattern p = Pattern.compile(regex);
// p.matcher(input).matches();
boolean matches(String regex, CharSequence input);

// 返回可以配置入参s的字面量模式。注意格式为\\Q表达式\\E。表达式中的元字符将当作普通字符处理
String quote(String s);
复制代码

      表达式属性:

复制代码
// 以\n作为换行符,内嵌为(?d)
Pattern.UNIX_LINES

// US-ASCII编码字符不区分大小写,内嵌为(?i)
Pattern.CASE_INSENSITIVE

// 忽略空格和注释(注释为以#开头直到出现换行符),内嵌为(?x)
Pattern.COMMENTS

// 启动多行模式,^和$匹配换行符或字符串起始位置。默认为单行模式,^和$仅匹配字符串起始位置。内嵌为(?m)
Pattern.MULTILINE

// 字面量模式,将元字符当作普通字符处理,没有内嵌方式,但可以通过"\\Q正则表达式\\E"的方式实现
Pattern.LITERAL

// 元字符.将匹配换行符。默认情况下,元字符.不匹配换行符。内嵌为(?s)
Pattern.DOTALL

// UNICODE编码字符不区分大小写,内嵌为(?u)
Pattern.UNICODE_CASE

// 当且仅当正则分解匹配时才配置成功。
Pattern.CANON_EQ

// 启用Unicode版本的预定义字符类和POSIX字符类,内嵌为(?U)
Pattern.UNICODE_CHARACTER_CLASS
复制代码

       实例方法:

复制代码
// 返回正则表达式
String pattern();

// 使用正则表达式匹配的字符串切割入参input
// 入参limit用于设置返回数组长度的最大值,设置为0时则不限制最大值。
String[] split(CharSequence input);
String[] split(CharSequence input, int limit);

// 获取匹配类
Matcher matcher(CharSequence input);
复制代码

   2. java.util.regex.Matcher类 :匹配类,用于存储模式实例匹配某字符串后所产生的结果。

       静态方法:

// 将入参s中的\和$元字符转换为普通字符,并返回处理后的s字符串。
String quoteReplacement(String s)

      实例方法:

复制代码
// 获取匹配子字符串的起始索引
int start();
// 获取匹配子字符串的结束索引
int end();

// 从字符串的end+1位置开始搜索下一个匹配的字符串
boolean find();
boolean find(int start);

// 通过分组索引获取分组内容,若入参group超出分组数量则抛异常
String group();
String group(int group);
// 通过分组名称获取分组内容,若没有相应的分组则返回null
String group(String name);

// 重置匹配实例内部的状态属性
Matacher reset();
// 重置匹配实例内部的状态属性,并重置被匹配的字符串
Matacher reset(CharSequence input);
// 重置模式实例,这导致group信息丢失,但注意:start等信息依旧保留不变。
Matcher usePattern(Pattern newPattern);

// 从字符串起始位开始将匹配成功的子字符串均用入参replacement替换掉
String replaceAll(String replacement);
// 从字符串起始位开始将第一个匹配成功的子字符串均用入参replacement替换掉
String replaceFirst(String replacement);
// 将从字符串起始位开始到最后一匹配的子字符串最后一个字符的位置的字符串复制到sb中,并用入参replacement替换sb中匹配的内容
String appendReplace(StringBuffer sb, String replacement);
// 将剩余的子字符串复制到sb中
String appendTail(StringBuffer sb);
// 示例: sb为one dog two dog
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) {
  m.appendReplacement(sb, "dog");
}

// 字符串从头到尾匹配表达式
boolean matches();
// 从字符串起始位置开始匹配表达式,但不要字符串从头到尾匹配表达式
boolean lookingAt();
复制代码

 

四、 java.lang.String实例                         

   实例方法:

String replaceAll(String replacement);
String replaceFirst(String replacement);
String[] split(String regex);
String[] split(String regex, int limit);
boolean matches(String regex)

 

五、最短路径实现诉求                          

复制代码
final class RegExp{
    // 全字符串匹配
    public static boolean isMatch(String regex, String input){
        if (null == input) return false;
        return input.matches(regex);
    }
    
    // 包含子字符串
    public static boolean contains(String regex, String input){
        Pattern r = Pattern.compile(regex);
        return r.matcher(input).find();
    }

    // 实现indexOf
    public static int indexOf(String regex, String input){
        Pattern r = Pattern.compile(regex);
        Matcher m = r.matcher(input);
        int index = -1;
        if(m.find())
            index = m.start();
        
        return index;
    }
    
    // 实现lastIndexOf
    public static int lastIndexOf(String regex, String input){
        Pattern r = Pattern.compile(regex);
        Matcher m = r.matcher(input);
        int index = -1;
        while(m.find())
            index = m.start();
        
        return index;
    }
    
    // 替换全部匹配字符串
    public static String replaceAll(String regex, String input, String replacement){
        if (null == regex || regex.isEmpty()) return input;
        return input.replaceAll(regex, replacement);
    }

    // 替换第N个匹配字符串
    public static String replaceSome(String regex, String input, String replacement, int n){
        if (null == regex || regex.isEmpty()) return input;
        if (0 == n) return input.replaceFirst(regex, replacement);
        
        Pattern r = Pattern.compile(regex);
        Matcher m = r.matcher(input);
        int i = 0;
        StringBuffer buffer = new StringBuffer();
        while (i <= n && m.find()){
            if (i == n){
                m.appendReplacement(buffer, replacement);
                m.appendTail(buffer);
            }
            ++i;
        }
        if (0 == buffer.length())
            buffer.append(input);
        
        return buffer.toString();
    }
    
    // 萃取字符串
    public static String extract(String regex, String input){
        String ret = "";
        Pattern r = Pattern.compile(regex);
        Matcher m = r.matcher(input);
        if (m.find())
            ret = m.group();
        
        return ret;
    }
    
    // 拆分字符串
    public static String[] split(String regex, String input, int limit){
        if (null == input || input.isEmpty() 
                || null == regex || regex.isEmpty()) return new String[]{input};
        return input.split(regex, limit);
    }
}
复制代码

   实际应用时当然不会像上面那么简单了。

 

六、Java支持的正则表达式功能语法                       

  本节内容仅针对正则表达式的高级功能语法进行叙述,而各语言的正则实现也就是这部分有所差异而已。

  1. 分组及反向引用

    [a].  (子表达式) ,自动命名分组(从1开始以数字自动为分组命名),后续表达式中可通过反向引用来获取该分组的内容。例如匹配字符串“so so”的正则表达式可以是 ^(\w{2})\s(\1)$ ,其中 \1 就是反向引用。

    [b]. (?:子表达式) ,非捕获分组,该类型的分组将不纳入匹配对象的group属性中,并且无法通过反向引用在表达式的后续部分获取该分组的内容。通常是配合 | 使用。例如匹配字符串"so easy"和"so hard"的正则表达式可以是 so\s(?:easy|hard) 

    [c].  (?<name>子表达式) ,命名分组,该类型的分组将纳入匹配对象的group属性中,并且可以在group属性值中通过name值来获取该分组的值。

    [d].  (?#注释) ,注释分组,该类型分组的内容将被正则表达式编译器忽略,仅供码农查阅而已。

                 

  2. 零宽先行断言

    零宽先行断言初看之下有点不知所云的感觉, 那么我们拆开来分析一下它的意思吧!

    零宽——意思是匹配的子表达式将不被纳入匹配结果,仅作为匹配条件而已。

    先行——意思是子表达式匹配的是后续字符串的内容。

    并且其细分为两类:

    [a].  子表达式B(?=子表达式A) ,零宽正向先行断言(也称为预搜索匹配)。例如匹配字符串"abcd"中的a和b的正则表达式可以是 \w(?=\w{2}) 

    [b].  子表达式B(?!子表达式A) ,零宽负向先行断言(也称为预搜索不匹配)。例如匹配字符串"abcd"中的c和d的正则表达式可以是 \w(?!\w{2}) 

 

  3. 零宽后行断言

    后行——意思是子表达式匹配的是前面字符串的内容。

     [a]. (?<=子表达式A)子表达式B ,零宽正向后行断言(也称为反向搜索匹配)。例如匹配字符串"abcd"中的c和d的正则表达式可以是 (?<=\w{2})\w 

     [b]. (?<!子表达式A)子表达式B ,零宽负向后行断言(也称为反向搜索不匹配)。例如匹配字符串"abcd"中的a和b的正则表达式可以是 (?<!\w{2})\w 

 

  4. 平衡组

    作用:用于匹配左右两边开始、结束符号数量对等的字符串。

    示例——萃取"<div>parent<div>child</div></div></div>"的子字符串"<div>parent<div>child</div></div>"

    失败的正则表达式: <div>.*</div> ,匹配结果为"<div>parent<div>child</div></div></div>"。

    成功的正则表达式: ((?'g'<div>).*?)+(?'-g'</div>)+ ,匹配结果为"<div>parent<div>child</div></div>"。

    在分析上述示例前,我们要认识一下平衡组相关的语法。

      (?'name'子表达式A) ,若成功匹配子表达式A,则往名为name的栈空间压一个元素。

      (?'-name'子表达式A) ,若成功匹配子表达式A,则弹出名为name的栈空间的栈顶元素,弹出元素后若栈空间为空则结束匹配。

      (?(name)yes表达式|no表达式) ,若名为name的栈空间非空,则使用yes表达式进行匹配,否则则使用no表达式进行匹配。

      (?(name)yes表达式) ,若名为name的栈空间非空,则使用yes表达式进行匹配。

      (?!) ,由于没有后缀表达式,因此总会导致匹配失败并结束匹配。

    下面我们一起来分析 ((?'g'<div>).*?)+(?'-g'</div>)+ 的匹配流程吧!

<div>parent     # 步骤1,((?'g'<div>).*?)匹配成功,然后向g栈压入一个元素
<div>child      # 步骤2,((?'g'<div>).*?)匹配成功,然后向g栈压入一个元素,现在栈含2个元素
</div>          # 步骤3,(?'-g'</div>)匹配成功,然后弹出g栈的栈顶元素,现在栈含1个元素
</div>          # 步骤4,(?'-g'</div>)匹配成功,然后弹出g栈的栈顶元素,现在栈含0个元素
                # 步骤5,由于g栈为空因此结束匹配,返回<div>parent<div>child</div></div>

     从该例子我们可以知道平衡组可以解决一些棘手的文本处理问题。但遗憾的是直到JDK1.7的原生API依旧不支持平衡组的功能语法,其余功能语法均被支持。而.Net的Regex类则支持平衡组,在这方面显然全面一些。当然比js连零宽后行断言都不支持要强不少了。

 

七、总结                                   

  到这里我们已经对Java对正则表达式的支持程度有一定程度的掌握,虽然不支持平衡组但已经为我们提供强大的文本处理能力了。不过我依旧不满意那个碍眼的转义符 \ ,假如我们要写正则表达式 \w\\\{\} 但实际运用时却要写成 \\w\\\\\\{\\} ,倘若能够像JS的正则表达式字面量一样使用,那就舒畅不少了!

  尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4098623.html  ^_^肥仔John 

 

八、参考                                  

http://deerchao.net/tutorials/regex/regex-1.htm
http://www.cnblogs.com/kissdodog/archive/2013/04/25/3043122.html

正则表达式帮助文档api 正则表达式帮助文档api,蛮好用的。 立即下载

相关推荐

使用 Python 获取实时港股行情数据

在本教程中,你将学习如何通过 Infoway API 获取港股实时行情数据,具体以腾讯控股(0700.HK)和汇丰控股(0005.HK)为例,使用 Python 进行数据请求和解析。

kk_stoper的博客 1517

正则表达式

参考:http://tool.oschina.net/uploads/apidocs/jquery/regexp.html^.*(Yes).*$ //包含 Yes^(?!.*(No)).*$ //不包含 No^(?!.*(No)).*(Yes).*$ //不包含 No,但是包含 Yes表达式全集字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n...

fevershen的专栏 587

2024.6.10丨基于DIAMOND与VFDB数据库的致病菌毒力因子高效注释指南

本文详细介绍了基于DIAMOND与VFDB数据库的致病菌毒力因子高效注释方法,涵盖工具安装、参数优化、数据库选择及实战案例解析。通过DIAMOND的快速比对和VFDB的全面毒力因子数据,显著提升微生物基因组研究效率,适用于临床检测、食品安全监测等多个场景。

weixin_33712987的博客 376

Vue - 跨域问题解决办法

后端分离不可避免会遇到跨域问题,可把我烦的想砍人,现在总结几个解决办法让后人不走歪路 环境: Vue-cli 4x 本地开发跨域问题 - 配置 devServer 打开根目录的 vue.config.js (没有则创建,vue 以前的版本有的是写在 config/index.js,有的写在 webpack.config.js,4x 版本统一在 vue.config.js),写入: module.exports = { devServer:{ host: ‘localhost’, // Vue开发项目启动域名

zeki10的博客 1万+

阿里云人工智能工程师ACA认证免费课程学习笔记

阿里云人工智能工程师ACA认证免费课程学习笔记

engchina的专栏 2013

【软件分享】天若OCR文字识别V4.48(翻译功能免费)

软件简介 吾爱破解论坛大佬天若幽心开发的一款OCR文字识别工具。支持快速截图识别,以及文本翻译。 下载地址 蓝奏云盘:点击下载 百度网盘:点击下载(密码:4dm4) 坚果云盘:点击下载 天翼云盘:点击下载 微软云盘:点击下载 使用教程 1、下载后对压缩包进行解压 2、双击天若OCR文字识别.exe 3、发现桌面右下角出现软件图标 4、双击软件图标即可开始截图识别 原帖地址 https://www.52pojie.cn/thread-692917-1-1.html ...

XavierJ的博客 1万+

Java魔法堂:深入正则表达式API

目录                               一、前言 二、正则表达式的使用诉求 三、java.util.regex包 四、java.lang.String实例 五、最短路径实现诉求 六、Java支持的正则表达式功能语法 七、总结 八、参考   一、前言                                正则表达式作为文本处理的利器,早已成为各...

weixin_34319640的博客 161

利用python求解规划问题

利用python中的cvxpy,sympy,scipy这三个库进行规划问题求解,本文中的例题均来自司守奎老师的python数学建模算法与应用

dashbaani的博客 1万+

HttpSecurity  regexMatchers

http.authorizeRequests()   .regexMatchers("^(?!.*(?i)(static|forgetPwd|forget)).*$")   .access("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER') or hasRole('ROLE_DBA') or hasRole('ROLE_ROOT')")

一叶竹 2326

抖音 X-Gorgon 加密算法逆向与 Python 爬虫实战(2026 最新版)

抖音(TikTok 国内版)作为日活超 8 亿的超级 App,其反爬体系在国内互联网中属于顶级难度。核心签名参数X-Gorgon和X-Khronos是几乎所有业务接口(视频详情、评论、搜索、用户主页)的“通行证”。没有正确的 Gorgon 签名,服务器直接返回403或。市面上的教程大多停留在2023 年之前的 V4 版本,而抖音在 2025 年底全面升级到了V6 协议,算法结构、加密常数、混淆方式全部重构。

2201_76125261的博客 352

uniapp - 应用软件在运行时,未见向用户告知权限申请的目的,向用户索取(存储、相机、电话)等权限,不符合华为应用市场审核标准(uniApp开发安卓APP上架应用市场审核被拒绝驳回,详细解决方案)

uniApp应用软件在运行时,未见向用户告知权限申请的目的,向用户索取(存储、相机、电话)等权限,不符合华为应用市场审核标准。uniapp vue2 vue3解决软件在运行时,未见向用户告知权限申请的目的,华为等上架被拒问题,关于华为应用市场上架需要同步告知使用权限的解决方案,uniApp应用软件在运行时,不符合华为应用市场审核标准。解决方案合集!app上架-您的应用在运行时,未同步告知权限申请的使用目的,向用户索取(相机)等权限,不符合华为应用市场审核标准。华为应用市场审核新规(未同步告知权限申请的使用目

🏆 前端领域优质创作者 4164

【JDK】正则表达式

1、正则表达式是什么 正则表达式判断str里面的内容是否全为数字 public class Test2 { public static void main(String[] args) { String str = "123"; if (str.matches("\\d+")){ int num = Integer.parseInt(...

tangxz的博客 685

YOLOv8 改进:使用 MobileNetV3 轻量化架构改进特征提取网络

通过使用 MobileNetV3 作为 YOLOv8 的特征提取器,能够显著降低模型复杂度和运行时资源消耗,同时在一定程度上保持检测精度。这种方法特别适合需要高效计算的边缘设备和嵌入式系统。

走向CTO的路上... 1275

Java 正则表达式

介绍 前段时间使用Java的正则表达式做一些字符串匹配的任务,现将学到的正则表达式的知识整理成文。 Java中Spring.class涉及到正则表达式。如Spring.split(), matches(),replaceAll()等方法。 Java中更一般使用正则表达式的方式是利用Pattern.class和Matcher.class,所在package为java.util.regex J...

学而不厌 诲人不倦 3万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java——正则表达式详解

Java对正则表达式的支持是从1.4版本开始的,此前的JRE版本不支持正则表达式。Java语言中的正则表达式匹配功能主要是通过和类实现的。find():在一个字符串里寻找一个给定模式的匹配:用一个给定的模式尝试匹配一个字符串的开头matches():用一个给定的模式去尝试匹配一个完整的字符串:进行替换操作,对所有的匹配都进行替换:进行替换操作,只对第一个匹配进行替换compile():把一个正则表达式编译成一个模式flags():返回某给定模式的匹配标志matches()

吴声子夜歌的博客 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Java 基础篇】Java 正则表达式

本篇博客介绍了 Java 正则表达式的基本概念、语法和常用操作。我们学习了如何创建正则表达式模式对象、匹配器对象,以及如何使用它们进行字符串的匹配、提取和替换操作。正则表达式在 Java 程序中具有广泛的应用,可以帮助我们处理文本数据,提取关键信息,进行格式验证等。通过灵活运用正则表达式,我们可以更高效地处理字符串操作。希望本篇博客对你理解和使用 Java 正则表达式有所帮助。祝你在 Java 编程中取得更多的成功!

繁依Fanyi的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java正则表达式

介绍并简单使用Java正则表达式

m0_62946761的博客 7255

【Java从入门到精通】Java 正则表达式

正则表达式定义了字符串的模式。正则表达式可以用来搜索、编辑或处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。Java 提供了 java.util.regex 包,它包含了 Pattern 和 Matcher 类,用于处理正则表达式的匹配操作。

RL2698853114的博客 1309

java正整数正则表达式_Java 正则表达式

Java 正则表达式正则表达式定义了字符串的模式。正则表达式可以用来搜索、编辑或处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。正则表达式实例一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 "Hello World" 字符串。.(点号)也是一个正则表达式,它匹配任何一个字符如:"a" 或 "1"。下表列出了一些正则表达式的实例及描述:正...

weixin_35652131的博客 4883

Java正则表达式——Java筑基

正则表达式并不仅仅局限于某种语言,但是在每个语言中都有差异。

qq_42544728的博客 2849
上一篇: Eclipse程序打包
下一篇: 正则表达式详解
qustfeng
博客等级 码龄17年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值