java正规表达式相关问题

本文探讨了两种不同的正则表达式匹配方法及其对性能的影响。一种方法可能导致内存溢出问题,而另一种方法能有效避免该问题并提高性能。文章还介绍了Pattern类的多个标志选项及其等效的嵌入标志表达式。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

(1)Pattern pt=Pattern.compile("<//s*body[^>]*>.*?<//s*/body//s*>", Pattern.CASE_INSENSITIVE |Pattern.DOTALL);

Matcher mt=pt.matcher(htmlContent);

while(mt.find()){
                        String content = mt.group();
                        content = content.replaceAll("<//s*body[^>]*>", "").replaceAll("<//s*/body//s*>", "").replaceAll("/r|/n", "");
                        if(content.matches("//s*(<//s*p[^>]*>)*(&nbsp;)*//s*(null)*//s*(&nbsp;)*(<//s*/p>)*//s*"))
                            return true;
                    }

 

 

如果用以下语句的话:

(2)Pattern pt=Pattern.compile("<//s*body[^>]*>(.|/n|/r)*?<//s*/body//s*>", Pattern.CASE_INSENSITIVE );

Matcher mt=pt.matcher(htmlContent);

while(mt.find()){
                        String content = mt.group();
                        content = content.replaceAll("<//s*body[^>]*>", "").replaceAll("<//s*/body//s*>", "").replaceAll("/r|/n", "");
                        if(content.matches("//s*(<//s*p[^>]*>)*(&nbsp;)*//s*(null)*//s*(&nbsp;)*(<//s*/p>)*//s*"))
                            return true;
                    }

但内容足够大时,因为mt.group();是通过递归查询符合正规的字符,但(.|/n|/r)*?是通过三个分支查找,当内容足够大

而内在不够大时会造成内存溢出,因此用语句(1)的表达式做正规匹配一次性匹配更可以提高性能,也不会造成内存溢出

 

 

Pattern.CASE_INSENSITIVE——启用不区分大小写的匹配。(? i)

Pattern.COMMENTS——允许在模式中使用空白和注释。(? x)

Pattern.DOTALL——启用dotall模式。在dotall模式下,表达式.匹配任何字符,包括行终止符。默认情况下,这个表达式不匹配行终止符。(? s)

Pattern.LITERAL——启用模式的字面量解析。指定了这个标志时,指定模式的输入字符串被当作字面量字符的序列。输入序列中的元字符或者转移 序列没有特殊含义。和这个标志结合使用时,标志CASE_INSENSITIVE和UNICODE_CASE保留它们对匹配的影响。

Pattern.MULTILINE——启用多行模式。在多行模式下,表达式^和$分别正好在行终止符或者输入序列的末尾的之前或者之后。默认情况下,这些表达式只匹配整个输入序列的开头和结尾。也可以通过嵌入标志表达式(? m)启动多行模式。

 

  嵌入标志表达式

常    量

等效的嵌入标志表达式

Pattern.CANON_EQ

Pattern.CASE_INSENSITIVE

(?i)

Pattern.COMMENTS

(?x)

Pattern.MULTILINE

(?m)

Pattern.DOTALL

(?s)

Pattern.LITERAL

Pattern.UNICODE_CASE

(?u)

Pattern.UNIX_LINES

(?d)

 

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值