返回顶部
首页 > 资讯 > 后端开发 > Python >Java正则表达式匹配字符串并提取中间值的方法实例
  • 254
分享到

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

2024-04-02 19:04:59 254人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录前言场景一:提取SAML2报文解析场景2:提取sql中的表名和字段总结前言 有时候正则表达式不只是匹配一下什么数字/邮箱/身份证/日期等等,还需要匹配某一段文字,并按照既定格式提

前言

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

场景一:提取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正则匹配字符串内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

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

本文链接: https://lsjlt.com/news/151843.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java正则表达式匹配字符串并提取中间值的方法实例
    目录前言场景一:提取SAML2报文解析场景2:提取sql中的表名和字段总结前言 有时候正则表达式不只是匹配一下什么数字/邮箱/身份证/日期等等,还需要匹配某一段文字,并按照既定格式提...
    99+
    2024-04-02
  • 怎么使用Java正则表达式匹配字符串并提取中间值
    今天小编给大家分享一下怎么使用Java正则表达式匹配字符串并提取中间值的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言有时...
    99+
    2023-07-02
  • java如何用正则表达式匹配与提取字符串
    java.util.regex类支持用正则表达式来匹配和提取字符串,读者可以去官网查看java.util.regex的详细使用方法。 首先给出一个匹配字符串的例子(判断line是否符...
    99+
    2024-04-02
  • java怎么用正则表达式匹配与提取字符串
    本文小编为大家详细介绍“java怎么用正则表达式匹配与提取字符串”,内容详细,步骤清晰,细节处理妥当,希望这篇“java怎么用正则表达式匹配与提取字符串”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先给出一个匹...
    99+
    2023-07-02
  • Java正则表达式循环匹配字符串方式
    目录正则表达式循环匹配字符串Java匹配正则表达式大全我们先举个例子来看看Java匹配正则表达式匹配表达式的特殊情况正则表达式循环匹配字符串 public static void m...
    99+
    2024-04-02
  • java正则表达式匹配字符串的方法是什么
    在Java中,我们可以使用正则表达式来匹配字符串,可以使用以下步骤实现:1. 导入`java.util.regex`包,该包包含了用...
    99+
    2023-08-09
    java
  • Python正则表达式匹配字符串中的数字
    这篇文章主要介绍了Python正则表达式匹配字符串中的数字,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下1.使用“\d+”匹配全数字...
    99+
    2023-06-01
  • 正则表达式之字符串模式匹配实例详解
    目录前言什么是正则表达式字符范围匹配元字符多次重复匹配定位匹配贪婪模式与非贪婪模式表达式分组结语前言 今天我们来学习正则表达式,正则表达式的应用十分广泛,几乎每个涉及到交互的项目都会...
    99+
    2024-04-02
  • python正则表达式对字符串的查找匹配
    目录常用的RegEx基础语法常用的RegEx函数以下为部分示例:总结Python中的正则表达式要用到re模块,下面先介绍一下正则表达式需要用到的特殊字符和说明 常用的RegEx基础语...
    99+
    2024-04-02
  • python用正则表达式提取/匹配中文汉字
    目录python用正则表达式提取中文python正则如何匹配中文汉字总结python用正则表达式提取中文 Python re正则匹配中文,其实非常简单,把中文的unicode字符串转...
    99+
    2024-04-02
  • python使用正则表达式匹配字符串开头并打印示例
    本文实例讲述了python使用正则表达式匹配字符串开头并打印的方法。分享给大家供大家参考,具体如下: import re s="name=z1hangshan username=fff url=www....
    99+
    2022-06-04
    示例 字符串 开头
  • 如何进行正则表达式匹配字符串的实现
    如何进行正则表达式匹配字符串的实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用正则表达式最常用的是考虑实现正则表达式匹配的判断,在实际工作中经常会遇到什么...
    99+
    2023-06-17
  • Python使用中文正则表达式匹配指定中文字符串的方法示例
    本文实例讲述了Python使用中文正则表达式匹配指定中文字符串的方法。分享给大家供大家参考,具体如下: 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下....
    99+
    2022-06-04
    中文 示例 字符串
  • VBS中正则表达式如何实现字符匹配
    这篇文章主要介绍了VBS中正则表达式如何实现字符匹配,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。字符匹配句点 (.) 匹配一个字符串中任何单个的打印或非打印字符,除了换行符...
    99+
    2023-06-09
  • C#中如何使用正则表达式和字符串匹配
    C#中如何使用正则表达式和字符串匹配正则表达式是一种强大的文本处理工具,它可以帮助我们有效地在字符串中进行模式匹配和提取。在C#中,通过使用System.Text.RegularExpressions命名空间下的Regex类,我们可以轻松地...
    99+
    2023-10-22
    正则表达式 (Regex) 字符串匹配 (string matching) C#编程 (C# Programming)
  • grep正则表达式匹配中括号的方法实例
    目录1. 匹配中括号,例如匹配 String[] args2. 匹配大括号,例如匹配 {abc 123}3. 同时匹配中括号和大括号,例如匹配 new byte[]{6, 55, 7...
    99+
    2024-04-02
  • java使用正则表达式匹配不包含某个规则的字符串
    测试数据:例如上面这几条简单的日志条目,我们想实现两个目标:把8号的数据过滤掉;把那些不包含robots.txt字符串的条目给找出来(只要Url中包含robots.txt的都给过滤掉)。前瞻的语法是:(!匹配模式)我们先来实现第一个目标——...
    99+
    2014-06-16
    java 正则表达式 不包含 规则 字符串
  • ES6中正则表达式和字符串正则方法的示例分析
    这篇文章给大家分享的是有关ES6中正则表达式和字符串正则方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。RegExp构造函数在ES5中,RegExp构造函数的参数有两...
    99+
    2024-04-02
  • 用正则表达式匹配字符串中汉字及中文标点符号
    目录问题:比如:Ps:补充:总结问题: 在写项目时遇到需要匹配字符串中所有的汉字并且包括简单的中文标点符号 比如: 匹配下面这个完成的字符串 let str = '上传文件,你好呀,...
    99+
    2024-04-02
  • C#中怎么利用正则表达式匹配相关字符串
    今天就跟大家聊聊有关C#中怎么利用正则表达式匹配相关字符串,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。使用C#中使用正则表达式System.Text.RegularExpressi...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作