论坛首页 Java企业应用论坛

神奇的java正则表达式

浏览 28499 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (6)
作者 正文
   发表时间:2011-01-07  
搞了这么久,楼主怎么不把有问题的cookie贴上来啊?
不告诉我们症状,怎么帮你找出问题的根源?
0 请登录后投票
   发表时间:2011-01-07   最后修改:2011-01-07
引用
你会来解析一下这是为何,我说的性能,你提的是灵活性,有毛关系。
装*给雷劈就是你这种

引用
不是性能不行 是你不会用. (此处说的是性能问题.)
正则应该用在描述容易改变的规则. 比如文本的搜索条件,输入的校验等.
方便以后规则的更改.(此处说的是适用正则的场合)

我没说我会正则调优.
但是我知道用这么一大堆乱七八糟的正则,来解析一个格式几乎不变的字符串肯定是不恰当的.
正则实际上也是通过循环解析字符串来执行.过多子表达式嵌套造成过多的循环.循环期间对象内存和栈空间不能及时回收.所以才造成了异常.

如果让正则高手来做正则调优肯定会有很大的效率提高.
如果非要正则,我给你的建议,拆分成为多个短正则配合逻辑代码多次匹配.

正则是一个很好的工具. 用不好要怪自己.不要怪工具.
就好比用绷带当治疗 还嫌不给力 就说绷带垃圾?
0 请登录后投票
   发表时间:2011-01-08  
蓝皮鼠 写道
我的正则式不怎么强。但是见过也维护过超复杂的正则式,比如超过几十行的。

经验是正则式最好用于单行简单内容的匹配,如果内容太长的话很难保证有时会出错。

关于StackOverflow原来有次的出错原因是用正则式处理去空白,当空白行太多时正则式写的不好会错。

另外就是对于特殊字符,GBK中的日文等等,有时会导致解析一次几十分钟或者几个小时才能完成。细节原因也没有搞清楚,后来对于这部分自己写解析器搞定了。

最终建议:对于自己能控制的内容,用正则式问题不大。对于未知内容,用正则式有风险,而且比较大。


严重同意,我也一直有在用正则,正则在处理文本,如果源内容长度可控的情况下是没有问题的,如果你都不知道你要用来检索的内容有多大,不要使用正则,起码不要使用复杂的正则。
0 请登录后投票
   发表时间:2011-01-08  
rochoc 写道
蓝皮鼠 写道
我的正则式不怎么强。但是见过也维护过超复杂的正则式,比如超过几十行的。

经验是正则式最好用于单行简单内容的匹配,如果内容太长的话很难保证有时会出错。

关于StackOverflow原来有次的出错原因是用正则式处理去空白,当空白行太多时正则式写的不好会错。

另外就是对于特殊字符,GBK中的日文等等,有时会导致解析一次几十分钟或者几个小时才能完成。细节原因也没有搞清楚,后来对于这部分自己写解析器搞定了。

最终建议:对于自己能控制的内容,用正则式问题不大。对于未知内容,用正则式有风险,而且比较大。


严重同意,我也一直有在用正则,正则在处理文本,如果源内容长度可控的情况下是没有问题的,如果你都不知道你要用来检索的内容有多大,不要使用正则,起码不要使用复杂的正则。



精通正则表达式上面 这点已经做了总结了
0 请登录后投票
   发表时间:2011-01-08  
xingqiba 写道
对于正则表达式,请记住一句老话:“ 您有一个问题,用正则表达式解决。那您就有两个问题了。” 

呵呵……
正则匹配的确麻烦,但是它的效率真的不高吗?
0 请登录后投票
   发表时间:2011-01-09   最后修改:2011-01-09
afunti 写道
xingqiba 写道
对于正则表达式,请记住一句老话:“ 您有一个问题,用正则表达式解决。那您就有两个问题了。” 

呵呵……
正则匹配的确麻烦,但是它的效率真的不高吗?



我对一般的复杂的表达式测试结果大约能到数十万到百万次每秒。 

对于表达式的递归深度, 文本的长度都需要有清醒的认识。

但是, 总是觉得性能很高, 到处滥用, 就有问题了。 曾经REVIEW到过一次请求5000次正则的检查的代码。
无论性能多高, 不能滥用而已。

这玩意的特点就是: 要么一点事情都没有, 突然出现了, 就能打垮整个服务器的CPU.  在生产故障中, 我碰到不少因此正则不合理使用导致服务器压力特别大, 导致崩溃的事情。
0 请登录后投票
   发表时间:2011-01-09  
蓝皮鼠 写道
我的正则式不怎么强。但是见过也维护过超复杂的正则式,比如超过几十行的。

经验是正则式最好用于单行简单内容的匹配,如果内容太长的话很难保证有时会出错。

关于StackOverflow原来有次的出错原因是用正则式处理去空白,当空白行太多时正则式写的不好会错。

另外就是对于特殊字符,GBK中的日文等等,有时会导致解析一次几十分钟或者几个小时才能完成。细节原因也没有搞清楚,后来对于这部分自己写解析器搞定了。

最终建议:对于自己能控制的内容,用正则式问题不大。对于未知内容,用正则式有风险,而且比较大。


比较同意你的说法。 我也遇见一些场景是:
1. 在以行处理的参数上, 单行文本太长, 导致性能问题
2. 表达式中包含了换行符, 导致性能问题
3. 大规模使用导致性能问题
4. 占溢出还是递归太多造造成的, 表达式太复杂,导致了深度递归。这个在JDK的表达式实现上比较容易出现, ORO的好象好很多。
1 请登录后投票
   发表时间:2011-01-10  
看下http://blog.csdn.net/shixing_11/archive/2010/11/09/5997567.aspx;文章
这种正则非常容易形成死循环,这是JDK1.4以来遗留的一个BUG。到JDK1.6也未解决。以后用正则,一定要谨慎,对于大批量的数据校验最好避免正则,SUN对JDK这个BUG有专门说明,请看如下:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5050507和
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6988218
1 请登录后投票
   发表时间:2011-01-10  
hswx_11 写道
看下http://blog.csdn.net/shixing_11/archive/2010/11/09/5997567.aspx;文章
这种正则非常容易形成死循环,这是JDK1.4以来遗留的一个BUG。到JDK1.6也未解决。以后用正则,一定要谨慎,对于大批量的数据校验最好避免正则,SUN对JDK这个BUG有专门说明,请看如下:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5050507和
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6988218

这个回复说到点子上了,如果真是因为某些bug引起死循环,那-Xss设置最大也没有用,最纳闷是,同样的要match的字符串输入并不能保证每次都会抛出StackOverflowError,而是偶尔才会出现,这样使得问题原因更难定位了。
0 请登录后投票
   发表时间:2011-02-15   最后修改:2011-02-15
sdh5724 写道
蓝皮鼠 写道
我的正则式不怎么强。但是见过也维护过超复杂的正则式,比如超过几十行的。

经验是正则式最好用于单行简单内容的匹配,如果内容太长的话很难保证有时会出错。

关于StackOverflow原来有次的出错原因是用正则式处理去空白,当空白行太多时正则式写的不好会错。

另外就是对于特殊字符,GBK中的日文等等,有时会导致解析一次几十分钟或者几个小时才能完成。细节原因也没有搞清楚,后来对于这部分自己写解析器搞定了。

最终建议:对于自己能控制的内容,用正则式问题不大。对于未知内容,用正则式有风险,而且比较大。


比较同意你的说法。 我也遇见一些场景是:
1. 在以行处理的参数上, 单行文本太长, 导致性能问题
2. 表达式中包含了换行符, 导致性能问题
3. 大规模使用导致性能问题
4. 占溢出还是递归太多造造成的, 表达式太复杂,导致了深度递归。这个在JDK的表达式实现上比较容易出现, ORO的好象好很多。


受教了。
正在做一个正则表达式,从网页html代码中提出table,
正则:<table(.|\\n|\\r)*?</table>
在js和一个桌面测试的正则工具下是正常的,但在java中当字符串长度超过826时就报栈溢出异常:
Exception in thread "main" java.lang.StackOverflowError
	at java.util.regex.Pattern$CharProperty.match(Pattern.java:3343)
	at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
	......

不知是我的正则有问题还是JDK的bug呢
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics