正则表达式Matcher.find报错 java.lang.StackOverflowError解决

在最近一个java项目中使用了正则表达式,抓取网页中的内容,明明很正确的正则表达式,但在Matcher.find时报错了:

    public static List<String> findStrs(String regx,String sourceStr){
        Pattern pattern = Pattern.compile(regx);
        Matcher m = pattern.matcher(sourceStr);
        List<String> result=new ArrayList<>(); 
        while (m.find()) {
            result.add(m.group(1));
        }        return result.size()<=0?null:result;
    }

后来单步调试,发现在第一次find时正确获取到,第二次报错了,错误是:

java.lang.StackOverflowError
	at java.lang.String.charAt(String.java:657)
	at java.util.regex.Pattern$Slice.match(Pattern.java:3971)
	at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4845)
	at java.util.regex.Pattern$GroupTail.match(Pattern.java:4719)
	at java.util.regex.Pattern$BranchConn.match(Pattern.java:4570)
	at java.util.regex.Pattern$CharProperty.match(Pattern.java:3779)
	at java.util.regex.Pattern$Branch.match(Pattern.java:4606)
	at java.util.regex.Pattern$GroupHead.match(Pattern.java:4660)
	at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4849)
	at java.util.regex.Pattern$GroupTail.match(Pattern.java:4719)
	at java.util.regex.Pattern$BranchConn.match(Pattern.java:4570)
	at java.util.regex.Pattern$CharProperty.match(Pattern.java:3779)
	at java.util.regex.Pattern$Branch.match(Pattern.java:4606)
	at java.util.regex.Pattern$GroupHead.match(Pattern.java:4660)
	at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4849)
	at java.util.regex.Pattern$GroupTail.match(Pattern.java:4719)
	at java.util.regex.Pattern$BranchConn.match(Pattern.java:4570)
	at java.util.regex.Pattern$CharProperty.match(Pattern.java:3779)
	at java.util.regex.Pattern$Branch.match(Pattern.java:4606)
	at java.util.regex.Pattern$GroupHead.match(Pattern.java:4660)
	at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4849)
	at java.util.regex.Pattern$GroupTail.match(Pattern.java:4719)
	at java.util.regex.Pattern$BranchConn.match(Pattern.java:4570)
	at java.util.regex.Pattern$CharProperty.match(Pattern.java:3779)
	at java.util.regex.Pattern$Branch.match(Pattern.java:4606)
	at java.util.regex.Pattern$GroupHead.match(Pattern.java:4660)
	at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4849)
	at java.util.regex.Pattern$GroupTail.match(Pattern.java:4719)
	at java.util.regex.Pattern$BranchConn.match(Pattern.java:4570)
	at java.util.regex.Pattern$CharProperty.match(Pattern.java:3779)
	at java.util.regex.Pattern$Branch.match(Pattern.java:4606)
	at java.util.regex.Pattern$GroupHead.match(Pattern.java:4660)
	at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4849)
... ...

在网上查了下,发现问题是栈溢出,有人给出了解决方法:

Pattern   pattern   =   Pattern.compile(re,Pattern.DOTALL   +   Pattern.MULTILINE);

其中Pattern.DOTALL   +   Pattern.MULTILINE指,在正则表达式中的:.可以代替所有字符,包括换行符\n。原先的写法可能是:xxx(?:\n|.)*?xxx,现在可以写成xxx.*?xxx,。

使用这个方法,问题暂时解决。但问题原理 不明,可能是sdk的bug吧。

注:此方法可以避免此问题,但附带的,因为在使用.时,忽略了换行,可能使用正则表达式匹配到更大范围的内容,所以写正则时需要格外小心。另外,后来我试了一下,只要在匹配时少于二个换行的内容,不使用此方法,也可以正常运行,所以感觉在java中使用正则表达式时,尽量的匹配少量的内容,就不会出错了。

原文地址:http://blog.51cto.com/13876446/2146846

时间: 2024-08-11 11:01:54

正则表达式Matcher.find报错 java.lang.StackOverflowError解决的相关文章

eclipse下执行wordcount报错 java.lang.ClassNotFoundException 解决办法

eclipse下执行wordcount报错 java.lang.ClassNotFoundException 17/08/29 07:52:54 INFO Configuration.deprecation: fs.default.name is deprecated. Instead, use fs.defaultFS 17/08/29 07:52:54 WARN util.NativeCodeLoader: Unable to load native-hadoop library for y

MapReduce 程序运行报错 java.lang.ClassNotFoundException解决方法

在创建自定义的Mapper时候,编译正确,但上传到集群执行时出现错误: 11/16/05 22:53:16 INFO mapred.JobClient: Task Id : attempt_201111301626_0015_m_000000_0, Status : FAILED java.lang.RuntimeException: java.lang.ClassNotFoundException: actiondemo.MyJob$MapClass at org.apache.Hadoop.

使用POI操作Excel时new XSSFWorkbook ()报错java.lang.NoSuchMethodError解决方式

使用最新的POI3.11时,在执行 Workbook  workBook = new XSSFWorkbook ();这段代码时出现错误: java.lang.NoSuchMethodError: javax.xml.stream.XMLEventFactory.newFactory()Ljavax/xml/stream/XMLEventFactory; at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesM

maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener

本篇文章主要介绍了"maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener ",主要涉及到maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener 方面的内容,对于maven web 项目中启动报错jav

报错:java.lang.Long cannot be cast to java.lang.Integer

Long 无法转化成Integer类型. 这个异常 经常出现在hinbernate分页查询的时候. 原因: 这里在Hibernate2.0之前版本list.get(0)返回的是Integer类型. 但是在Hibernate3.0以后版本list.get(0)返回的是Long类型. 解决方法 public Integer getUsersCount() { String hql = "select count(*) from Users"; List list = super.pageQ

开着idea,死机了,关机重启。重启之后,重新打开idea报错java.lang.AssertionError:upexpected content storage modification

开着idea,死机了,关机重启.重启之后,重新打开idea报错java.lang.AssertionError:upexpected content storage modification. goole得到: If you cannot even open your project in IntelliJ: Close IntelliJ Go to the directory <your_home>/.IntelliJIdeaXX/system/cache where XX is your

Android Studo 使用 JNI报错:java.lang.UnsatisfiedLinkError: Couldn&#39;t load XXX from loader dalvik.system.PathClassLoader

今天在使用Android Studio的时候突然发现代码没错,so包也引入了,各个版本都引入了,但是就是一直报错: java.lang.UnsatisfiedLinkError: Couldn't load serphone from loader dalvik.system.PathClassLoader 11-30 11:13:18.766 29255-29255/com.personal.tai.ronglianim E/AndroidRuntime: at java.lang.Runti

MyEclipse2014报错java.lang.ClassNotFoundException

MyEclipse2014做web开发的时候,总是报错java.lang.ClassNotFoundException.而对应的类有能在包中找到.原因一般是由下面情况引起的. 在开发的时候,我们习惯性的在lib下面根据包类型或作用分文件夹来管理,然后手动将包导入到项目中(此时包会在Referenced Libraries中),而MyEclipse2014只会自动加载Web app Libraries文件夹中的包. 解决办法就是,将所有的支撑包都放到lib目录下,而不要在lib目录下分文件夹管理.

jdbc连接sqlserver报错java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver

使用2008的数据库, 我已经引入的sqljdbc4的包,单还是报这个错,很奇怪突然想到在配置hibernate的时候,是拷贝下来的代码 然后到网上查了下, 因为是2008的版本驱动和2000的有点不同, 之前的都是可能是2000或者2005的class是com.microsoft.jdbc.sqlserver.SQLServerDriver 可是2008  去是com.microsoft.sqlserver.jdbc.SQLServerDriver 就这么改过来就可以了 jdbc连接sqlse