正则表达式(三)——Java中的相关函数
1、前言
之前在学习Python时,我已经说过正则表达式的相关语法,这里不再赘述了,有需要可以参考:
2020.10.7 正则表达式(一) - ShineLe - 博客园
现在开始学习Java中的正则表达式匹配。
需要注意的是Java中用\\代表\,Python中的\d在Java中写为\\d
2、模块:java.util.regex.*
3、用法
3.1、预编译正则字符串:Pattern.compile( regrex_string )
Pattern p = Pattern.compile( regrex_string );
3.2、用Pattern匹配目标字符串:matcher()
Matcher m = p.matcher( Obj_String );
3.3、分组提取:group()
String s = m.group( n );//提取匹配到的第n项
n取0时是整个字符串;取1时是第一个子串;取2时是第二个子串...
注意
分组提取之前,必须首先调用matches()判断是否匹配成功,成功后才能调用group()提取子串。
完整例子
import java.util.regex.*; public class Main { public static void main(String[] args) { Pattern p = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})"); Matcher m = p.matcher("010-12345678"); if(m.matches()){ String g1 = m.group(1); String g2 = m.group(2); System.out.println(g1); System.out.println(g2); } else{ System.out.println("匹配失败"); } } }
4、非贪婪匹配:末尾补?,尽量少匹配
正则表达式默认使用贪婪匹配:任意规则,它总是尽可能多地向后匹配。
比如,一串数字123000以若干个0结尾,要分别提取数字和0,那么很多人都会认为正则字符串应当写为"(\\d+)(0*)"。但是提取的结果是"123000"和"",就是由于贪婪匹配造成的。
要让\d+少匹配,0*多匹配,我们就要让\d+使用非贪婪匹配,在之后添加?写为\d+?即可实现。
区分?的含义
\d??,第一个?表示0或1个数字,加上第二个?表示非贪婪匹配,尽量少匹配,所以实际上匹配0个数字。
5、方法
5.1、分割字符串:String.split( regex_string )
String的split()方法支持用正则表达式分割字符串。
5.2、搜索:matcher.find()
我们获取到Matcher对象后,调用find()方法,返回的是符合匹配规则的子串。
不断调用find()就能得到所有符合规则的子串了。
5.3、替换字符串:s.replaceAll( regex , Obj_String )
把String s中的所有符合regex的子串替换为Obj_String。
5.4、反向引用:$1、$2、$3....
替换时,如果想用某个特定字符串指代查找到的子串,可以用$1、$2...代指,比如,给查找到的字符串前后加<b>和</b>,那么在replaceAll时,传入的第二个参数(也就是替换成的新串)可以写成<b>$1</b>。
例子:给String中的所有四字子串前后加上<b>与</b>
String s = "the quick brown fox jumps over the lazy dog."; String r = s.replaceAll("\\s([a-z]{4})\\s", " <b>$1</b> "); //r = the quick brown fox jumps <b>over</b> the <b>lazy</b> dog.
本例中,就是用$1代指了查找到的子串。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性