Java正则表达式匹配字符串并提取中间值的方法实例

 更新时间:2022年06月17日 16:06:03   作者:Moshow郑锴  
正则表达式常用于字符串处理、表单验证等场合,实用高效,下面这篇文章主要给大家介绍了关于Java正则表达式匹配字符串并提取中间值的相关资料,需要的朋友可以参考下

前言

有时候正则表达式不只是匹配一下什么数字/邮箱/身份证/日期等等,还需要匹配某一段文字,并按照既定格式提取其中的某些值.

场景一:提取SAML2报文

SAML2报文内容如下,从中提取对应的attribute name和value.

<saml:AttributeStatement>
    <saml:Attribute Name="mail">
        <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">zhengkai.blog.csdn.net</saml:AttributeValue>
    </saml:Attribute>
    <saml:Attribute Name="cn">
        <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">amAdmin</saml:AttributeValue>
    </saml:Attribute>
</saml:AttributeStatement>

show time

public static void main(String[] args) {
        String content = "";
        content = "<saml:AttributeStatement>";
        content += "    <saml:Attribute Name=\"mail\">";
        content += "        <saml:AttributeValue xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"xs:string\">zhengkai.blog.csdn.net</saml:AttributeValue>";
        content += "    </saml:Attribute>";
        content += "    <saml:Attribute Name=\"cn\">";
        content += "        <saml:AttributeValue xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"xs:string\">amAdmin</saml:AttributeValue>";
        content += "    </saml:Attribute>";
        content += "</saml:AttributeStatement>";
        String pattern = "\\<saml\\:Attribute Name=\\\"(?<scope>.*?)\\\"\\>[\\s\\S]*?\\<saml\\:AttributeValue[\\s\\S]*?\\>(?<value>.*?)\\<\\/saml\\:AttributeValue\\>[\\s\\S]*?\\<\\/saml\\:Attribute\\>";
        Pattern r = Pattern.compile(pattern);
        Matcher matcher = r.matcher(saml2attributeString);
        while (matcher.find()){
            String attributeName = matcher.group("scope");
            String attributeValue = matcher.group("value");
            System.out.println("attributeName->"+attributeName +",attributeValue->"+attributeValue );
        }
    }

控制台输出

$ attributeName->mail,attributeValue->zhengkai.blog.csdn.net
$ vattributeName->cn,attributeValue->amAdmin

解析

\\<saml\\:Attribute Name=\\\"(?<scope>.*?)\\\"\\>[\\s\\S]*?\\<saml\\:AttributeValue[\\s\\S]*?\\>(?<value>.*?)\\<\\/saml\\:AttributeValue\\>[\\s\\S]*?\\<\\/saml\\:Attribute\\>
  1. (?<scope>.*?)是用于标识scope的方式,表示夹在中间的字符串都叫scope,可以通过matcher.group("scope")提取。
  2. 所有非正则的符号都需要转义,所以你会看到很多\\<或者换\\"之类的\\
  3. [\\s\\S]*? 是用来匹配任意字符,表示在前后有界定的情况下(例如夹在<xxx></xxx>中间的字符串),可以忽略那些不规则字符串的匹配。

场景2:提取sql中的表名和字段

来自github网友@ydq 给SpringBootCodeGenerator贡献的正则表达式,非常不错,值得深刻学习.

    //匹配整个ddl,将ddl分为表名,列sql部分,表注释
    private static final Pattern DDL_PATTERN = Pattern.compile("\\s*create\\s+table\\s+(?<tableName>\\S+)[^\\(]*\\((?<columnsSQL>[\\s\\S]+)\\)[^\\)]+?(comment\\s*(=|on\\s+table)\\s*'(?<tableComment>.*?)'\\s*;?)?$", Pattern.CASE_INSENSITIVE);
    //匹配列sql部分,分别解析每一列的列名 类型 和列注释
    private static final Pattern COL_PATTERN = Pattern.compile("\\s*(?<fieldName>\\S+)\\s+(?<fieldType>\\w+)\\s*(?:\\([\\s\\d,]+\\))?((?!comment).)*(comment\\s*'(?<fieldComment>.*?)')?\\s*(,|$)", Pattern.CASE_INSENSITIVE);

    public static void parse(String sql){
        Matcher matcher = DDL_PATTERN.matcher(sql);
        if (matcher.find()){
            String tableName = matcher.group("tableName");
            String tableComment = matcher.group("tableComment");
            System.out.println(tableName + "\t\t" + tableComment);
            System.out.println("==========");
            String columnsSQL = matcher.group("columnsSQL");
            if (columnsSQL != null && columnsSQL.length() > 0){
                Matcher colMatcher = COL_PATTERN.matcher(columnsSQL);
                while (colMatcher.find()){
                    String fieldName = colMatcher.group("fieldName");
                    String fieldType = colMatcher.group("fieldType");
                    String fieldComment = colMatcher.group("fieldComment");
                    if (!"key".equalsIgnoreCase(fieldType)){
                        System.out.println(fieldName + "\t\t" + fieldType + "\t\t" + fieldComment);
                    }
                }
            }
        }
    }

    public static void main(String[] args){
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        parse("CREATE TABLE `userinfo` (\n" +
                "  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',\n" +
                "  `username` varchar(255) NOT NULL COMMENT '用户名',\n" +
                "  `addtime` datetime NOT NULL COMMENT '创建时间',\n" +
                "  PRIMARY KEY (`user_id`)\n" +
                ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息'");
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        parse("CREATE TABLE `USER` (\n" +
                "`ID` varchar(32) PRIMARY KEY COMMENT '主键',\n" +
                "`password` varchar(32) NOT NULL COMMENT '密码',\n" +
                "`username` varchar(32) NOT NULL COMMENT '用户'\n" +
                ") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        parse("CREATE TABLE `tb_amount` (\n" +
                "`ID` int(10) NOT NULL AUTO_INCREMENT,\n" +
                "`PRODUCT_CODE` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '产品代码',\n" +
                "`GENDER` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '性别(male,female)',\n" +
                "`MIN_INSURED_AGE` int(3) NULL DEFAULT NULL COMMENT '最小投保年龄',\n" +
                "`MAX_INSURED_AGE` int(3) NULL DEFAULT NULL COMMENT '最大投保年龄',\n" +
                "`AMOUNT` double(10, 2) NULL DEFAULT NULL COMMENT '基本保额',\n" +
                "`PREMIUM_RATE` double(10, 2) NULL DEFAULT NULL COMMENT '基本保费',\n" +
                "`YEAR_NUM` int(3) NULL DEFAULT NULL COMMENT '缴费年限',\n" +
                "`PREMIUM_TYPE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '费率类型',\n" +
                "`INSURANCE_PERIOD` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '保险期间(30年,60年)',\n" +
                "`INSURANCE_PERIOD_TYPE` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '保险期间类型(如定期年0,定期岁1,终身2,以后终身对应值:200)',\n" +
                "`PAY_MODE` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '交费方式',\n" +
                "PRIMARY KEY (`ID`) USING BTREE\n" +
                ") ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;");
    }

控制台输出内容:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
`userinfo`        用户信息
==========
`user_id`        int        用户ID
`username`        varchar        用户名
`addtime`        datetime        创建时间
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
`USER`        null
==========
`ID`        varchar        主键
`password`        varchar        密码
`username`        varchar        用户
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
`tb_amount`        null
==========
`ID`        int        null
`PRODUCT_CODE`        varchar        产品代码
`GENDER`        varchar        性别(male,female)
`MIN_INSURED_AGE`        int        最小投保年龄
`MAX_INSURED_AGE`        int        最大投保年龄
`AMOUNT`        double        基本保额
`PREMIUM_RATE`        double        基本保费
`YEAR_NUM`        int        缴费年限
`PREMIUM_TYPE`        varchar        费率类型
`INSURANCE_PERIOD`        varchar        保险期间(30年,60年)
`INSURANCE_PERIOD_TYPE`        varchar        保险期间类型(如定期年0,定期岁1,终身2,以后终身对应值:200)
`PAY_MODE`        varchar        交费方式

总结

到此这篇关于Java正则表达式匹配字符串并提取中间值的文章就介绍到这了,更多相关Java正则匹配字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nacos与SpringBoot实现配置管理的开发实践

    Nacos与SpringBoot实现配置管理的开发实践

    在微服务架构中,配置管理是一个核心组件,而Nacos为此提供了一个强大的解决方案,本文主要介绍了Nacos与SpringBoot实现配置管理的开发实践,具有一定的参考价值
    2023-08-08
  • 手把手带你理解java线程池之工作队列workQueue

    手把手带你理解java线程池之工作队列workQueue

    这篇文章主要介绍了java线程池之工作队列workQueue,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Spring Boot 实现敏感词及特殊字符过滤处理

    Spring Boot 实现敏感词及特殊字符过滤处理

    这篇文章主要介绍了SpringBoot实现敏感词及特殊字符过滤处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java多线程编程之Lock用法实例

    Java多线程编程之Lock用法实例

    这篇文章主要介绍了Java多线程编程之Lock用法实例,本文直接给出代码实例,需要的朋友可以参考下
    2015-05-05
  • Spring测试 其实很简单

    Spring测试 其实很简单

    这篇文章主要为大家详细介绍了Spring测试,其实很简单,揭开集成测试神秘的面纱,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • java.util.Collections类—emptyList()方法的使用

    java.util.Collections类—emptyList()方法的使用

    这篇文章主要介绍了java.util.Collections类—emptyList()方法的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 浅谈SpringSecurity注解与AOP切面执行顺序

    浅谈SpringSecurity注解与AOP切面执行顺序

    这篇文章主要介绍了浅谈SpringSecurity注解与AOP切面执行顺序,引入Spring Security后,在Controller的方法中会出现Spring Security的方法注解与AOP同时存在的问题,这是就会设计顺序问题,需要的朋友可以参考下
    2023-10-10
  • Spring Cloud Feign内部实现代码细节

    Spring Cloud Feign内部实现代码细节

    Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。接下来通过本文给大家分享Spring Cloud Feign内部实现代码细节,感兴趣的朋友一起看看吧
    2021-05-05
  • MyBatis-Plus 使用枚举自动关联注入

    MyBatis-Plus 使用枚举自动关联注入

    本文主要介绍了MyBatis-Plus 使用枚举自动关联注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • 基于Protobuf动态解析在Java中的应用 包含例子程序

    基于Protobuf动态解析在Java中的应用 包含例子程序

    下面小编就为大家带来一篇基于Protobuf动态解析在Java中的应用 包含例子程序。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论