Java正则表达式使用

news/2025/2/26 10:51:41

这里不讲基本的正则字符,只说一下Java中使用正则的常用API

基本代码,后面的基于他们

// 构建正则
Pattern pattern = Pattern.compile("((\\d)(\\d))");
// 匹配字符串
Matcher matcher = pattern.matcher("23sgfew8h8erh23gewjrg3er");

判断匹配

// 注意这里判断的是整个字符串是否匹配
System.out.println(matcher.matches());
//  判断开头是否匹配
System.out.println(matcher.lookingAt());

分组概念

先左边后右边,若有嵌套,先外面再里面
例如((a)(b))(d)
分组0为全部即:abd
分组1为:ab
分组2为:a
分组3为:b
分组4为:d

查找分组

// 从指定下标开始寻找会移动查找指针 默认空参的从下标0开始找
System.out.println(matcher.find(12));
// 恢复查找指针
matcher.reset();
while (matcher.find()){//寻找局部匹配  多次调用会自动后移指针  可以这样获取全部匹配子串
   // 获取匹配的整体子串  与matcher.group(0)等价 底层调用的就是
   System.out.println(matcher.group());
   // 获取匹配整体子串的开始与结束下标
   System.out.println(matcher.start()+"-"+matcher.end());
   // 获取分组数
   System.out.println(matcher.groupCount());
   // 获取指定分组的内容
   System.out.println(matcher.group(1));
   // 获取指定分组的开始与结束下标
   System.out.println(matcher.start(1)+"-"+matcher.end(1));
}

替换操作

都可以使用$num引用分组

//全部替换
String s = matcher.replaceAll("NUM-$1");
//只替换第一个
String s1 = matcher.replaceFirst("NUM-$1");

引用前文

若想判断前后一致可以使用\num引用前面的分组(注意\转义问题)
例如需要找 n-n 的字符串 n必须相同且是一个数字

Pattern compile = Pattern.compile("(\\d)-\\1");

拼接操作(常用)

Map<String,String> map=new HashMap<>();
map.put("name","博丽灵梦");
map.put("age","16");
Pattern pattern = Pattern.compile("\\$\\{(\\w+)}");
Matcher matcher = pattern.matcher("My Name Is ${name} My Age Is ${age}!");
// 注意拼接必须是 StringBuffer 
StringBuffer buffer=new StringBuffer();
while (matcher.find()){
	// 获取${}的内容并进行替换
    String s = map.getOrDefault(matcher.group(1), "UN_KNOWN");
    //  拼接这次指针移动的部分 s为额外附加的 可以使用$num引用这次匹配的分组
    matcher.appendReplacement(buffer,s);
}
// 附加指针后的全部内容
matcher.appendTail(buffer);
System.out.println(buffer);//输出	My Name Is 博丽灵梦 My Age Is 16!

几种常用模式

Pattern.compile(rex,MODE);
MODE取值:
Pattern.CASE_INSENSITIVE//不区分大小写匹配
Pattern.COMMENTS//忽略空白行与#整行注释
Pattern.DOTALL// 指定 . 可以匹配任意字符 默认无法匹配行终止符


http://www.niftyadmin.cn/n/658001.html

相关文章

推荐两个不错的flink项目

最近flink真是风生水起&#xff0c;但是浪院长看来这不过是阿里错过了创造spark影响力之后&#xff0c;想要在flink领域创建绝对的影响力。但是&#xff0c;不可否认flink在实时领域确实目前来看独树一帜&#xff0c;当然也有它不适合的地方&#xff0c;比如今天要推荐的第一个…

LOJ 6433 「PKUSC2018」最大前缀和——状压DP

题目&#xff1a;https://loj.ac/problem/6433 想到一个方案中没有被选的后缀满足 “该后缀的任一前缀和 <0 ”。 于是令 dp[ S ] 表示选了点集 S &#xff0c;满足任一前缀和 <0 的方案。很好转移。 令 f[ S ] 表示选了点集 S &#xff0c;且 S 整体就是最大前缀和的方案…

Zookeeper简单学习

观察者模式 Zookeeper实际是观察者模式负责存储管理数据&#xff0c;接收观察者的注册&#xff0c;一旦数据发生变化&#xff0c;Zookeeper负责通知对应的观察者 Zookeeper文件系统通知系统 Zookeeper特点 1&#xff0c;一个领导者(Leader)多个跟随着(Follower) 2&#xff…

B. Working out 四角dp

https://codeforces.com/problemset/problem/429/B 这个题目之前写过&#xff0c;不过好像。。忘记了&#xff0c;今天又没有写出来&#xff0c;应该之前没有想明白。。。 这个应该算一个四角dp(网上说的&#xff0c;感觉很符合)&#xff0c;所以呢就是要从四个角进行dp&#x…

xml数据岛 + recordset 数据处理程序简单例子

本程序将数据库中数据一次性装载到客户端xml数据岛中&#xff0c;然后在客户端处理 用recordset 处理数据。 从数据库中提取数据的程序&#xff1a;xmlDeptMatch.asp <!--#include file"../inc/conn.asp"--><!--#include file"../inc/config.asp"…

Java透明窗体绘制不遮挡鼠标交换

我原来想用Java写个桌宠&#xff0c;探索了一下&#xff0c;发现直接继承JFrame设置背景色为透明&#xff0c;再直接在子类下重写的paint(Graphics g)写绘图事件就能实现该功能 动画偏移懒与发射的物体位置懒得校对了&#xff0c;可能会有部分不准确 这个代码有点多&…

Docker 及Docker-distribution

一&#xff1a;docker-distribution#1、获取仓库中的镜像curl 127.0.0.1:5000/v2/_catalog #2、获取镜像的标签curl registry_url/<name>/tags/list 二&#xff1a;Docker #1、默认docker 本地镜像 /var/lib/docker/image/overlay2/imagedb/content/sha256 #2、默认docke…

pl/sql语言的中几个知识点的总结(一)

1 用 update 多字段批量更新 update dog qq set(b,c)(select b,c from cat tt where tt.aqq.a)上面的括号很重要&#xff0c;不能省略。 如果是t-sql就不能这样写。需要有一个from dog的语句。相比来说麻烦了点儿 2 用目表生成新表并拷贝数据 create table horse as sel…