java自带的正则表达式类库的效率

时间:2021-02-25 11:20:38
java.util.regex提供了的对正则表达式的支持,但是感觉效率不是很高..不排除是我表达式写的不好..想问下相比.net或者c++,java自带的这个类库的效率如何?
我看有些第三方的正则表达式的java类库,不知道有没有效率更高点的...我现在用java自带的这个,解析的时候cpu基本占满,而且消耗时间也比较长.
谁能给点改进的建议?谢谢

13 个解决方案

#1


没有

http://hi.baidu.com/jingleq/blog/item/7bc39b62b61839dce7113a54.html

#2


不清楚有沒有。。。
不過沒覺得regex效率低呀?
我想問下。。。你的el一般長度是多少?超過20個單位的長度么?

#3


一般正则的实现都可能来自于GNU的实现,但是.Net的显然不会是的,那肯定是MS自己写的,MS的代码往往都是效率高的。
这些都是都是考虑开源问题的。


#4


to yami251139:
el是什么?

#5


引用 2 楼 yami251139 的回复:
不清楚有沒有。。。 
不過沒覺得regex效率低呀? 
我想問下。。。你的el一般長度是多少?超過20個單位的長度么?

#6


知道有些..至于效率..不清楚
你去apache看看...

#7



java的正则速度还算很快吧,因为有过自己写的原以为很快了,结果用正则发现要快不少

解析的时候cpu基本占满......这个不是问题吧???CPU多少是操作系统调度问题吧,再说了占满才能速度快啊。
另外你说的时间长,最好也说一下数据量多少,你的正则啥样啊,要不怎么判断。。。。

#8


NFA 的实现是比较慢,如果你的正则表达式太占内存和速度的化,
需要从正则表达式本身进行优化,尽量减少回溯和无穷匹配的次数。

#9


引用 8 楼 bao110908 的回复:
NFA 的实现是比较慢,如果你的正则表达式太占内存和速度的化, 
需要从正则表达式本身进行优化,尽量减少回溯和无穷匹配的次数。

那就用DFA

#10


尽量少用选择结构(选择结构对 NFA 的效率影响是很大的),不需要捕获时采用非捕获组,
适时地使用 + 侵占量词,比如 (?:june|july) 尽量写成 ju(?:ne|ly),\d{3} 可以写
成 \d\d\d 等等之类的,具体的优化可以看看 Mastering Regular Expressions 一书。

至于其他的正则库基本上都是采用 NFA 引擎的,与 Java 中的性能区别是不大的,而且与
其他语言的性能区别也不是很大的。

据 Mastering Regular Expressions 上所说 Tcl 是采用 NFA 和 DFA 混合引擎的,
它是经过精心设计的,根据不同的表达式选择不同的引擎,这无疑是最优秀的。

#11


我找到了apache的oro,但是有的地方搞不太懂...
我的正则表达式用零宽段言用得比较多,大概形式是这类的:(?<=类((\\s*)|[ ]*)(型|别)(:|:|\\s|[ ])).*

另外问下oro里用不了"?<=exp"么,但是"?=exp"可以用啊.

#12


java 里的正则表达式还没用过呢。
帮顶了

#13


引用 1 楼 xlongbuilder 的回复:
没有 

http://hi.baidu.com/jingleq/blog/item/7bc39b62b61839dce7113a54.html

2楼给的帖子挺好的

#1


没有

http://hi.baidu.com/jingleq/blog/item/7bc39b62b61839dce7113a54.html

#2


不清楚有沒有。。。
不過沒覺得regex效率低呀?
我想問下。。。你的el一般長度是多少?超過20個單位的長度么?

#3


一般正则的实现都可能来自于GNU的实现,但是.Net的显然不会是的,那肯定是MS自己写的,MS的代码往往都是效率高的。
这些都是都是考虑开源问题的。


#4


to yami251139:
el是什么?

#5


引用 2 楼 yami251139 的回复:
不清楚有沒有。。。 
不過沒覺得regex效率低呀? 
我想問下。。。你的el一般長度是多少?超過20個單位的長度么?

#6


知道有些..至于效率..不清楚
你去apache看看...

#7



java的正则速度还算很快吧,因为有过自己写的原以为很快了,结果用正则发现要快不少

解析的时候cpu基本占满......这个不是问题吧???CPU多少是操作系统调度问题吧,再说了占满才能速度快啊。
另外你说的时间长,最好也说一下数据量多少,你的正则啥样啊,要不怎么判断。。。。

#8


NFA 的实现是比较慢,如果你的正则表达式太占内存和速度的化,
需要从正则表达式本身进行优化,尽量减少回溯和无穷匹配的次数。

#9


引用 8 楼 bao110908 的回复:
NFA 的实现是比较慢,如果你的正则表达式太占内存和速度的化, 
需要从正则表达式本身进行优化,尽量减少回溯和无穷匹配的次数。

那就用DFA

#10


尽量少用选择结构(选择结构对 NFA 的效率影响是很大的),不需要捕获时采用非捕获组,
适时地使用 + 侵占量词,比如 (?:june|july) 尽量写成 ju(?:ne|ly),\d{3} 可以写
成 \d\d\d 等等之类的,具体的优化可以看看 Mastering Regular Expressions 一书。

至于其他的正则库基本上都是采用 NFA 引擎的,与 Java 中的性能区别是不大的,而且与
其他语言的性能区别也不是很大的。

据 Mastering Regular Expressions 上所说 Tcl 是采用 NFA 和 DFA 混合引擎的,
它是经过精心设计的,根据不同的表达式选择不同的引擎,这无疑是最优秀的。

#11


我找到了apache的oro,但是有的地方搞不太懂...
我的正则表达式用零宽段言用得比较多,大概形式是这类的:(?<=类((\\s*)|[ ]*)(型|别)(:|:|\\s|[ ])).*

另外问下oro里用不了"?<=exp"么,但是"?=exp"可以用啊.

#12


java 里的正则表达式还没用过呢。
帮顶了

#13


引用 1 楼 xlongbuilder 的回复:
没有 

http://hi.baidu.com/jingleq/blog/item/7bc39b62b61839dce7113a54.html

2楼给的帖子挺好的