博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式高级用法【原】
阅读量:4434 次
发布时间:2019-06-07

本文共 4494 字,大约阅读时间需要 14 分钟。

开发过程中的真实场景

A报文

seeYou
]]>

 

嵌套在A报文中的B报文

 

场景

我得到A报文,后需要解析提取B报文转发给目标系统.

而现有解析代码PatternTool.java如下:

package kingtool;import java.util.regex.Matcher;import java.util.regex.Pattern;public class PatternTool {    /**     * 从regex表达式中提供对应的值     * @author King     */    public static String parsePattern(String regex, String content ,int groupNum) {        String ret = "";        String str = "";        String output ="";        try {            Pattern p = Pattern.compile(regex);            Matcher m = p.matcher(content);            if (m.find()) {                for(int i = 0 ; i  <= m.groupCount() ; i ++){                    if(i == 0){                                            }else{                        str = m.group(i);                        output = String.format("解析得正则表达式%s中group(%d)匹配的值\n",regex,i);                        System.out.println(output);                        System.out.println(str);                    }                }                ret = m.group(groupNum);                System.out.println("返回第"+groupNum+"组匹配到的内容:\n"+ret);            }else{                System.out.println("未解析到正则表达式"+regex+"匹配的的值\n");            }        } catch (Exception e) {            e.printStackTrace();        }        return ret;    }        public static void main(String[] args) {        String content = FileTool.readStringFromFile("D://c.txt", "GBK"    );        //希望匹配
.*.*
String regex = "
(.*)
(.*)
"; String ret = parsePattern(regex,content,2); }}

 

解析后,打印结果如下(并非最终想要的B报文):

文件 D://c.txt存在与否?: true读到的文件内容如下:
seeYou
]]> 解析得正则表达式
(.*)
(.*)
中group(1)匹配的值 解析得正则表达式(.*)(.*)中group(2)匹配的值 nice to meet you! ]]> 解析得正则表达式
(.*)
(.*)
中group(3)匹配的值 返回第3组匹配到的内容:

 

现在来分析以上原因:

1.因为正则默认是贪婪的(全取模式,能吃多少是多少),所以第一个(.*)先取 

然后一点一点从尾部吐出来,直到匹配(<!\[CDATA\[(.*)\]\]>)就停止吐字符,至此 group(1) 匹配结束.

 2. 现在来匹配第二个(.*),老规矩先全取

 

然后一个一个吐字符,直到遇到]]>

 

3. 最后来匹配第三个(.*),老规矩先全取

 

直到遇到</CONTENT>停下

 

最终,这完全不是我们希望看到的匹配结果 nice to meet you! ]]> </PACKET>

 

解决方案: 加个?变成懒猫模式即可

把PatternTool.java中main主函数的正则匹配式regex中的第一个括号中加一个?,变成懒猫模式

public static void main(String[] args) {        String content = FileTool.readStringFromFile("D://c.txt", "GBK"    );        //希望匹配
.*.*
String regex = "
(.*?)
(.*)
"; String ret = parsePattern(regex,content,2); }

解析后,打印结果如下(是最终想要的B报文):

文件 D://c.txt存在与否?: true读到的文件内容如下:
seeYou
]]> 解析得正则表达式
(.*?)
(.*)
中group(1)匹配的值 解析得正则表达式
(.*?)
(.*)
中group(2)匹配的值
解析得正则表达式
(.*?)
(.*)
中group(3)匹配的值 返回第2组匹配到的内容:

 

现在来分析以上原因:

1.因为加了?后,正则变成了懒猫模式(特别地懒,能不吃就不吃),所以第一个(.*?)先取 

然后一点一点吃字符进来,直到匹配(<!\[CDATA\[(.*)\]\]>)就停止吃字符,至此 group(1) 匹配结束.

 2. 现在来匹配第二个(.*),老规矩先全取

 

然后一个一个吐字符,直到遇到]]>

 

3. 最后来匹配第三个(.*),老规矩先全取

 

直到遇到</CONTENT>停下

 

最终,这就是我们希望看到的匹配结果 :

 

 

 

 

 

总结:

正则默认贪婪模式 : 能取多少是多少

加了?后变成懒猫模式 : 能不取就尽量不取

 

 

.

转载于:https://www.cnblogs.com/whatlonelytear/p/5764298.html

你可能感兴趣的文章
SpringCloud实战——(1)创建SpringCloud项目
查看>>
selenium-01-2环境搭建
查看>>
在ASP.NET MVC 中获取当前URL、controller、action(转载)
查看>>
char,wchar_t,WCHAR,TCHAR,ACHAR的区别----LPCTSTR
查看>>
A + B Problem II
查看>>
列表之取消热点效果(鼠标跟踪功能)
查看>>
(32)zabbix分布式监控proxy vs nodes
查看>>
微信在线游戏以及微信公众号小说如何在微信中做好防封防屏蔽工作
查看>>
lambda distinct
查看>>
web前端好学吗?
查看>>
IOS 开源Framework
查看>>
图论-最小生成树模版
查看>>
使用curl模拟ip和来源进行网站采集的实现方法
查看>>
关于文件操作
查看>>
BZOJ-3212 Pku3468 A Simple Problem with Integers 裸线段树区间维护查询
查看>>
ChibiOS/RT 2.6.9 CAN Low Level Driver for STM32
查看>>
查询帮助
查看>>
ASP.NET Session详解(转)
查看>>
[POJ1007]DNA Sorting
查看>>
Java读取文件
查看>>