Java正则多字符串匹配替换
发布时间:2021-12-16 02:24:48
Java中使用也比较简单:
1. 编译正则表达式的字面值得到对应的模式Pattern对象;
2. 创建匹配给定输入与此模式的匹配器Matcher;
3. 通过匹配器对象执行操作,匹配器对象的方法很丰富,方法之间组合使用更加强大。
public static void main(String[] args) {
//被替换关键字的的数据源
Map<String,String> tokens = new HashMap<String,String>();
tokens.put("cat", "Garfield");
tokens.put("beverage", "coffee");
//匹配类似velocity规则的字符串
String template = "${cat} really needs some ${beverage}.";
//生成匹配模式的正则表达式
String patternString = "\\$\\{(" + StringUtils.join(tokens.keySet(), "|") + ")\\}";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(template);
//两个方法:appendReplacement, appendTail
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
matcher.appendReplacement(sb, tokens.get(matcher.group(1)));
}
matcher.appendTail(sb);
//out: Garfield really needs some coffee.
System.out.println(sb.toString());
//对于特殊含义字符"\","$",使用Matcher.quoteReplacement消除特殊意义
matcher.reset();
//out: cat really needs some beverage.
System.out.println(matcher.replaceAll("$1"));
//out: $1 really needs some $1.
System.out.println(matcher.replaceAll(Matcher.quoteReplacement("$1")));
//到得邮箱的前缀名。插一句,其实验证邮箱的正则多种多样,根据自己的需求写对应的正则才是王道
String emailPattern = "^([a-z0-9_\\.\\-\\+]+)@([\\da-z\\.\\-]+)\\.([a-z\\.]{2,6})$";
pattern = Pattern.compile(emailPattern);
matcher = pattern.matcher("test@qq.com");
//验证是否邮箱
System.out.println(matcher.find());
//得到@符号前的邮箱名 out: test
System.out.println(matcher.replaceAll("$1"));
//获得匹配值
String temp = "<meta-data android:name=\"appid\" android:value=\"joy\"></meta-data>";
pattern = Pattern.compile("android:(name|value)=\"(.+?)\"");
matcher = pattern.matcher(temp);
while(matcher.find()) {
//out: appid, joy
System.out.println(matcher.group(2));
}
}
一些老是忘基础
[...] 位于括号之内的任意字符
[^...] 不在括号之中的任意字符
. 除了换行符之外的任意字符,等价于[^\n]
\w 任何单字字符, 等价于[a-zA-Z0-9]
\W 任何非单字字符,等价于[^a-zA-Z0-9]
\s 任何空白符,等价于[\ t \ n \ r \ f \ v]
\S 任何非空白符,等价于[^\ t \ n \ r \ f \ v]
\d 任何数字,等价于[0-9]
\D 除了数字之外的任何字符,等价于[^0-9]
[\b] 一个退格直接量(特例)
{n, m} 匹配前一项至少n次,但是不能超过m次
{n, } 匹配前一项n次,或者多次
{n} 匹配前一项恰好n次
? 匹配前一项0次或1次,也就是说前一项是可选的. 等价于 {0, 1}
+ 匹配前一项1次或多次,等价于{1,}
* 匹配前一项0次或多次.等价于{0,}
| 选择.匹配的要么是该符号左边的子表达式,要么它右边的子表达式
(...) 分组.将几个项目分为一个单元.这个单元可由 *、+、?和|等符号使用,而且还可以记住和这个组匹配的字符以供此后引用使用
\n 和第n个分组所匹配的字符相匹配.分组是括号中的子表达式(可能是嵌套的).分组号是从左到右计数的左括号数
^ 匹配的是字符的开头,在多行检索中,匹配的是一行的开头
$ 匹配的是字符的结尾,在多行检索中,匹配的是一行的结尾
\b 匹配的是一个词语的边界.简而言之就是位于字符\w 和 \w之间的位置(注意:[\b]匹配的是退格符)
\B 匹配的是非词语的边界的字符
题外话
邮箱验证,以前验证邮箱,网上搜个正则装在自己程序里面就用,其实这是不对的,不同的公司对邮箱的验证格式是不一样的,比方说163和qq邮箱注册,他们要求的格式都不一样,所以搜一个正则表达式就去套所有的邮箱格式也是不对的,符合自己的需求的正则才是正确的。


猜你喜欢
- 一. 假设需求场景在我们开发的过程中,经常出现两个对象存在一对多或多对一的关系。如何在程序在表明这两个对象的关系,以及如何利用这种关系优雅地
- 我用的是Eclipse打包,但在CMD窗口执行的时候报“ActiveMQ.jar中没有主清单属性”错误。在网上搜了下,这个与MANIFEST
- 局限性只支持MP4文件经过尝试对于一些MP4文件分割不了依赖<!-- mp4文件操作jar --><!-- https:/
- using System;using System.Collections.Generic;using System.Text;using
- 要实现关机后数据也不会丢失,需要使用到 AndroidViewModel,SaveStateHandle 和 SharePreference
- 使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:import java.util.Map;imp
- NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。使用 NPOI 可以在没有安装 Office 或者相应环境的机
- 1、什么是GOCW 为了解决在Csharp下编写OpenCV程序的问题,我做过比
- mybatis-plus 可以通过@TableId注解指定主键生成策略@TableId(value="id",type=
- Android之选项菜单和子菜单学习笔记,供大家参考,具体内容如下菜单简介:菜单在桌面应用中使用十分广泛,几乎所有的桌面应用都有菜单。但是随
- 记得当初自己刚开始学习Java的时候,对Java的IO流这一块特别不明白,所以写了这篇随笔希望能对刚开始学习Java的人有所帮助,也方便以后
- java的Console类的使用方法及实例JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备。如果你的Java
- 需求前台有日期字符串的数据,提交到后台。后台实体类使用Date属性接收。日期字符串有多种格式,需要用一个转换器将合法的日期字符串格式转换为D
- 题外话: 泛型与通配符是Java语法中比较难懂的两个语法,学习泛型和通配符的主要目的是能够看懂源码,实际使用的不多。1.泛型1.1泛型的用法
- 弃用内容先来纠正一个误区。主要之前在版本更新介绍的时候,存在一些表述上的问题。导致部分读者认为这次的更新是Datasource本身初始化的调
- 本文实例为大家分享了Android调用系统图库获取图片的具体代码,供大家参考,具体内容如下1、开发工具与关键技术:Eclipse、Andro
- 分页使用可以说非常普遍了,有时候会需要非常灵活的方式去开启或关闭分页,尝试使用一 * 解的方式来进行分页。依赖安装需要使用的依赖:Mybati
- 背景SpringBoot 版本<parent> <groupId>org.springfr
- java 工厂模式的实例详解工厂方法中的“工厂”和我们平常理解的一样:用于生产产品。而客户是要和产品打交道,所以工厂方法模式的意义在于把客户
- 通过自定义注解的方式(如:@SysLog(obj = "操作对象", text = "操作内容"),