最近在做正则表达式的时候出现了点问题,我是用apache的ORO来做的,但我估计这个和正则表达式的解析包没什么关系。
拿一个简单例子来说:
比如对于一个html文件,假设我想取出<html></html>之间的所有代码(不包括<html>和</html>),我的匹配模式书写如下:String regexp = "<html>((.|\n)*?)</html>";结果运行后错误错误,错误是这样的:
Exception in thread "main" java.lang.StackOverflowError
at org.apache.oro.text.regex.Perl5Matcher.__match(Unknown Source)
at org.apache.oro.text.regex.Perl5Matcher.__match(Unknown Source)
at org.apache.oro.text.regex.Perl5Matcher.__match(Unknown Source)
我分析了一下,这个是堆栈溢出异常,应该是我取的的内容太大,超过了限制所导致的。后来我把<html>和</html>中的内容减少了之后,发现的确是可以正常取出数据的,但是数据量大就出现了上面的问题。当然这只是一个例子,我想知道,对于匹配结果非常大的时候,各位是如何解决的?偶对正则表达式研究一般,还请各位不惜赐教。
拿一个简单例子来说:
比如对于一个html文件,假设我想取出<html></html>之间的所有代码(不包括<html>和</html>),我的匹配模式书写如下:String regexp = "<html>((.|\n)*?)</html>";结果运行后错误错误,错误是这样的:
Exception in thread "main" java.lang.StackOverflowError
at org.apache.oro.text.regex.Perl5Matcher.__match(Unknown Source)
at org.apache.oro.text.regex.Perl5Matcher.__match(Unknown Source)
at org.apache.oro.text.regex.Perl5Matcher.__match(Unknown Source)
我分析了一下,这个是堆栈溢出异常,应该是我取的的内容太大,超过了限制所导致的。后来我把<html>和</html>中的内容减少了之后,发现的确是可以正常取出数据的,但是数据量大就出现了上面的问题。当然这只是一个例子,我想知道,对于匹配结果非常大的时候,各位是如何解决的?偶对正则表达式研究一般,还请各位不惜赐教。
解决方案 »
- 很菜的菜鸟求助 compareto的问题
- 问下关于匹配字符串
- 我想有一个正则可以去掉,所有的html标签内容,然后去掉回车,换行这些标签,然后下面的内容希望变成
- paint() update() paintComponent() paintComponent()这些方法是怎么调用的?什么时候需重写?
- socket问题???急
- 我们是否要为了测试而写代码?
- 想安装HOTJAVA 为什么只是像DOS方式执行一下,一闪而过呢?不执行呢?
- 如何设置KVM的内存大小,widow2000 OS!
- 急急急!!一个关于jdk1.4.0的问题
- File类中的length()方法与IO中InputStream类中的available()方法功能重复?
- 江湖告急:sun.net.ftp.FtpClien类的BUG???
- 如何用JAVA自带的API快速构建一个高效连接池???
Pattern p=Pattern.compile("<html>(.*+)</html>",Pattern.DOTALL);
Matcher m=p.matcher(dddddddd); //dddddd表示你的html文件内容
if (m.matches())
System.out.println(m.group());
In dotall mode, the expression . matches any character, including a line terminator. By default this expression does not match line terminators. Dotall mode can also be enabled via the embedded flag expression (?s). (The s is a mnemonic for "single-line" mode, which is what this is called in Perl.)
占有的模式 是. *+
楼主用的是.*?这是勉强的,能够保证最后只匹配一个,但是中间可是要反复回溯的。
你这个明显就是因为html文件过大,赋给字符串之后内存溢出了。这样的话只能逐个字符读取数据了。事实上正则表达式的效率确实很低,相反indexOf()和substring()的效率是最高的,
如果楼主觉得我说的没道理,我也没得说了。