JAVA正则表达式提取key-value类型字符值代码实例

 更新时间:2022年10月10日 09:24:11   作者:苍林骑士  
这篇文章主要给大家介绍了关于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字符值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java简单计算圆周率完整示例

    Java简单计算圆周率完整示例

    这篇文章主要介绍了Java简单计算圆周率,结合完整实例形式分析了Java计算圆周率的原理与操作技巧,代码备有较为详尽的注释便于理解,需要的朋友可以参考下
    2018-05-05
  • Java详细讲解分析双指针法的使用

    Java详细讲解分析双指针法的使用

    严格的来说,双指针只能说是是算法中的一种技巧。双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的
    2022-04-04
  • Java之System.getProperty()的作用及使用说明

    Java之System.getProperty()的作用及使用说明

    这篇文章主要介绍了Java之System.getProperty()的作用及使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Spring Boot实现微信扫码登录功能流程分析

    Spring Boot实现微信扫码登录功能流程分析

    这篇文章主要介绍了Spring Boot 实现微信扫码登录功能,介绍了授权流程代码和用户登录和登出的操作代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Java深入浅出讲解String类常见方法

    Java深入浅出讲解String类常见方法

    在C语言中,如果要表示字符串而且对字符串进行操作的话,依靠的是数组和指针,而Java中提供了String类用来专门表示字符串,String类中常见的方法,以及一些细节是本篇重点
    2022-04-04
  • Springboot整合mybatis的步骤

    Springboot整合mybatis的步骤

    这篇文章主要介绍了Springboot整合mybatis的步骤,帮助大家更好的理解和学习使用
    2021-04-04
  • 一文详解Java抽象类到底有多抽象

    一文详解Java抽象类到底有多抽象

    这篇文章主要介绍了一文详解Java抽象类到底有多抽象,抽象方法所在的类必须是抽象类,子类若继承了一个抽象类,就必须覆写父类的所有抽象方法,这里的子类是普通类,是强制要求覆写所有抽象方法,但是如果子类也是一个抽象类,那么就可以不覆写
    2022-06-06
  • Java自动释放锁的三种实现方案

    Java自动释放锁的三种实现方案

    在笔者面试过程时,经常会被问到各种各样的锁,如乐观锁、读写锁等等,非常繁多,下面这篇文章主要给大家介绍了关于Java自动释放锁的三种实现方案,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Java输出Hello World完美过程解析

    Java输出Hello World完美过程解析

    当我们学习一门编程语言的时候,我们都会先学如何输出Hello World!本文通过几个例子给大家介绍输出Hello World的代码,感兴趣的朋友一起看看吧
    2021-06-06
  • Java面试题冲刺第七天--Spring框架1

    Java面试题冲刺第七天--Spring框架1

    这篇文章主要为大家分享了最有价值的三道Spring框架面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论