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

作者:Moshow郑锴 时间:2022-02-06 11:22:43 

前言

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

场景一:提取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        交费方式

来源:https://blog.csdn.net/moshowgame/article/details/94447007

标签:java,正则表达式,匹配
0
投稿

猜你喜欢

  • 你是真正的用户体验设计者吗? Ⅱ

    2008-03-21 12:30:00
  • python求平均数、方差、中位数的例子

    2022-08-23 21:24:57
  • 人生苦短我用python python如何快速入门?

    2021-06-01 03:57:09
  • 使用Python爬虫库requests发送请求、传递URL参数、定制headers

    2023-08-29 09:47:47
  • 深度学习Tensorflow 2.4 完成迁移学习和模型微调

    2023-12-04 14:56:17
  • Python中 传递值 和 传递引用 的区别解析

    2023-12-26 07:05:22
  • 手把手教你用python绘制热度图(heatmap)

    2023-07-01 21:03:03
  • 常见系统中文字体的英文名

    2008-03-03 12:44:00
  • 细品Dreamweaver MX 2004内建FW技术

    2010-09-02 12:38:00
  • 解读Python中字典的key都可以是什么

    2023-09-23 05:29:37
  • python 实现兔子生兔子示例

    2022-04-13 05:15:11
  • 实例讲解Python的函数闭包使用中应注意的问题

    2022-05-17 23:29:53
  • 查看python下OpenCV版本的方法

    2022-12-24 18:15:32
  • 深入了解Python中Lambda函数的用法

    2023-02-03 10:09:01
  • 详解Django+Uwsgi+Nginx 实现生产环境部署

    2022-11-10 10:37:41
  • Python实现二叉排序树与平衡二叉树的示例代码

    2023-01-04 17:29:36
  • Python实现yaml与json文件批量互转

    2023-11-20 07:07:54
  • 9个提高 Python 编程的小技巧

    2022-01-20 16:53:28
  • 利用windows任务计划实现oracle的定期备份

    2009-08-31 12:24:00
  • asp如何使用MsChart制图工具?

    2010-06-05 12:40:00
  • asp之家 网络编程 m.aspxhome.com