JAVA正则表达式提取key-value类型字符值代码实例
背景
本人最近半年参与过两个从字符文本中提取相关信息需求开发,在开发过程中需要通过写java正则去匹配截取字符,希望通过这篇文档总结一些使用心得
先回顾一下基础知识:
方括号表达式(用于确定取值范围):
- [xyz] :字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。
- [^xyz] :反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。
- [a-z] :字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。
- [^a-z] :反向范围字符。匹配不在指定的范围内的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"范围内的任何字符
- [a-zA-Z] : 表示是英文字母
- [0-9] : 表示是数字
预定义字符匹配符:
- . :匹配任意的字符
- \d :表示数字
- \D :表示非数字
- \s :表示由空字符组成,[ \t\n\r\x\f]
- \S :表示由非空字符组成,[^\s]
- \w :表示字母、数字、下划线,[a-zA-Z0-9_]
- \W :表示不是由字母、数字、下划线组成
- \s :匹配任何空白字符,包括空格、制表符、换页符等
次数匹配符:
- ? : 表示出现0次或1次
- + : 表示出现1次或多次
- * : 表示出现0次、1次或多次
- {n}:表示出现n次
- {n,m}:表示出现n~m次
- {n,}:表示出现n次或n次以上
边界匹配符:
- ^ :行的开头
- $ :行的结尾
java.util.regex 包主要包括以下两个个类:
Pattern 类:
- Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式,
- Pattern.complie(String regex)简单工厂方法创建一个正则表达式
Matcher 类:
- Matcher 对象是对输入字符串进行解释和匹配操作的引擎,Pattern.matcher(CharSequence input)返回一个Matcher对象
- Matcher.find() //返回true or false 对字符串进行匹配,匹配到的字符串可以在任何位置.
- Matcher.group(int i) // 返回匹配到的子字符串,m.group(1)返回第一组匹配到的子字符串
代码实例
如果要提取 字符串为 "本端IP=177.148.165.110 本端端口=60001" 我们要提取本端IP。key值之间以空格分割
public class Test{
public static void main( String[] args ){
// 按指定模式在字符串查找 \\s作为空白符
String line = "本端IP=177.148.165.110 本端端口=60001 ";
String pattern = "本端IP=(.*?)(\\s)";
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
if (m.find( )) {
// 0 代表整个表达式。每出现一个左括号"("记做一个分组,分组编号从 1 开始。
// 返回第一组匹配到的子字符串
System.out.println("Found value: " + m.group(1) );
} else {
System.out.println("NO MATCH");
}
}}1、分组
用小括号来指定子表达式(a)、(abc)、(bc)可以把多个字符当一个单独单元进行处理,本例中(.*?)创建了一个分组,代表本端IP的地址,
m.group(1) 返回匹配的输入的第一个子序列。
2、惰性匹配和贪婪匹配
(.*?) 为惰性匹配,最小匹配。本例中会提取以“本端IP=”开头,以空格结束的字符,会提取到 177.148.165.110
(.*)默认是贪婪匹配,最大匹配,它将会匹配最长的以“本端IP=”开始,以空格结束的字符,会提取到 177.148.165.110 本端端口=60001
3、分割符
假如是以“;”或者“,”分割键值对,我们可以把pattern 换成 "本端IP=(.*?)(;)" 和 "本端IP=(.*?)(,)";
如果要同时兼容 空格、“;”和“,”作为分隔符可以 pattern 换成 “本端端口=(.*?)(\\s|;|,)"
4、结束符
2 假如要提取字符串为:"本端端口=60001 本端IP=177.148.165.110" 我们要提取本端IP在字符串行尾,需要用“$”作为 结束符
public class Test{
public static void main( String[] args ){
// 按指定模式在字符串查找 $作为行末尾
String line = "本端端口=60001 本端IP=177.148.165.110";
String pattern = "本端IP=(.*?)($)";
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
if (m.find( )) {
// 0 代表整个表达式。每出现一个左括号"("记做一个分组,分组编号从 1 开始。
// 返回第一组匹配到的子字符串
System.out.println("Found value: " + m.group(1) );
} else {
System.out.println("NO MATCH");
}
}}假如要同时兼容 "本端IP=177.148.165.110 本端端口=60001" 和 "本端端口=60001 本端IP=177.148.165.110" 这两种位置 字符排列,pattern可以调整为:
String pattern = "本端IP=(.*?)(\\s|$)";
总结
到此这篇关于JAVA正则表达式提取key-value类型字符值的文章就介绍到这了,更多相关java提取key-value字符值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot数据库初始化datasource配置方式
这篇文章主要为大家介绍了SpringBoot数据库初始化datasource配置方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-12-12
Java web入门指南之在Idea上创建Java web项目
好多书上的JavaWeb教程都是Eclipse以及MyEclipse,当然这里不论IDE的好坏,下面这篇文章主要给大家介绍了关于Java web入门指南之在Idea上创建Java web项目的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下2023-06-06
MyBatis XML去除多余AND|OR前缀或逗号等后缀的操作
这篇文章主要介绍了MyBatis XML去除多余AND|OR前缀或逗号等后缀的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2021-02-02
Java之SpringBoot实现基本增删改查(前后端分离版)
这篇文章主要介绍了Java中SpringBoot如何实现基本的增删改查,前后端分离版,没有和前端进行联系,感兴趣的小伙伴可以借鉴阅读本文2023-03-03
后端如何接收格式为x-www-form-urlencoded的数据
x-www-form-urlencoded格式是一种常见的HTTP请求数据格式,它将请求参数编码为键值对的形式,以便于传输和解析,下面这篇文章主要给大家介绍了关于后端如何接收格式为x-www-form-urlencoded的数据,需要的朋友可以参考下2023-05-05
解决@Async(“taskExecutor“)异步线程报错问题
这篇文章主要介绍了解决@Async(“taskExecutor“)异步线程报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-08-08


最新评论