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字符值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis Plus 代码生成器的实现

    Mybatis Plus 代码生成器的实现

    这篇文章主要介绍了Mybatis Plus 代码生成器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • springboot如何集成Swagger2

    springboot如何集成Swagger2

    这篇文章主要介绍了springboot集成Swagger2的方法,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-12-12
  • java后端合成图片的实现示例

    java后端合成图片的实现示例

    本文主要介绍了java后端合成图片的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Java设计模式之java状态模式详解

    Java设计模式之java状态模式详解

    这篇文章主要介绍了Java设计模式之状态模式定义与用法,结合具体实例形式详细分析了Java状态模式的概念、原理、定义及相关操作技巧,需要的朋友可以参考下
    2021-09-09
  • struts2的国际化实现网站整体中英文切换实例代码

    struts2的国际化实现网站整体中英文切换实例代码

    本篇文章主要介绍了struts2的国际化实现网站整体中英文切换实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Java的最大栈深度与JVM核心知识介绍

    Java的最大栈深度与JVM核心知识介绍

    这篇文章主要有两个部分,一部分介绍JAVA的最大栈深度,第二部分介绍了JVM核心知识,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • Java实现基于JDBC操作mysql数据库的方法

    Java实现基于JDBC操作mysql数据库的方法

    这篇文章主要介绍了Java实现基于JDBC操作mysql数据库的方法,结合实例形式分析了java使用JDBC实现针对mysql数据库的连接、查询、输出等相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • mybatis-plus 返回部分字段的解决方式

    mybatis-plus 返回部分字段的解决方式

    这篇文章主要介绍了mybatis-plus 返回部分字段的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • log4j使用详细解析

    log4j使用详细解析

    Log4j 除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。下面通过本文给大家介绍log4j使用详细解析,感兴趣的朋友一起看看吧
    2017-10-10
  • Java springboot探究配置文件优先级

    Java springboot探究配置文件优先级

    在springboot项目中,我们可以通过在yml文件中设置变量,再通过@Value注解来获得这个变量并使用,但如果这个项目已经部署到服务器上,我们想更改这个数据了需要怎么做呢,其实在springboot项目中,配置文件是有优先级的
    2023-04-04

最新评论