java正则式简介(2)

本文探讨了正则表达式的两种解析算法NFA与DFA的时间复杂度,并提供了多种正则表达式优化策略,包括减少回退次数、Pattern.compile()的使用、Matcher对象的复用等,帮助开发者提高正则表达式的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则式解析算法

      NFA(不确定的有穷自动机):时间复杂度O(|N|*|x|)|N|表示NFA的状态数, |x|表示匹配串的长度。

      DFA (确定的有穷自动机):时间复杂度O(nlogn) ,nDFA的状态数。速度明显比NFA要高。

      避免使用类似(a|b)*a(a|b)(a|b)…(a|b),包含了n-1(a|b)的正则表达式。为什么?

正则式的强大工具: Jflex

 

正则式优化

      减少回退次数
java.util.regex
包使用NFA.正由于使用了这个算法,对于某些正则式性能会比较差,因为,NFA对于每个节点状态有多个出口状态,有可能利用回退策略尝试其他节点状态。
考虑下面的例子:正则表达式是“scored|ared|oringx”,输入字符串是“scared”

               优化:例如将“(abcd|abef)”替换为“abcd|ef)”。

      Pattern.compile()编译,代替直接使用Pattern.matches()

      通过调用reset()方法对不同的输入字符串重复使用Matcher对象

      考虑选择的顺序,要将比较常用的选择项放在前面.例如,如果XY使用频率高,则”w(X|Y)””w(Y|X)”要好得多。

      获取每次使用引起小损失的分组。如果你实际并不需要获取一个分组内的文本,那么就使用非捕获分组。例如使用“(?:X)”代替X)”。

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值