关于java正则表达式使用出现栈溢出的情况

本文介绍了在使用Java正则表达式处理大文本时遇到的栈溢出错误,分析了NFA自动机在正则匹配中的递归调用导致的问题。提出通过简化正则表达式,避免使用"+"运算符,以及拆分文本和优化正则表达式的方法来防止栈溢出,确保实验中内容格式的正确性。
摘要由CSDN通过智能技术生成

近期,在实验的过程中,用到了java的正则语言表达式,类似的正则语言是str=“(A|B(\.0)?)+"的正则表达式。在读取比较小的文本进行正则匹配时,运行良好,但是遇到稍大一点的文本时,就出现了stack overflow的错误
学习了一部分自动机的知识后,结合网上的搜索内容,对这个问题谈一下认识。

由自动机的知识,可以得到如图的关系:
在这里插入图片描述
对于每一个正则表达式对会对应一个FA。
在语言中会将正则表达式转换为一种自动机对字符串进行识别。
在java语言中,是将正则表达式转换为NFA对语言进行识别。

自动机分为2类:DFA和NFA;
DFA是确定有穷自动机,每种状态对于输入的每个字符都有一个确定的状态转换,目标状态为一个;NFA是非确定有穷自动机,在一个状态下识别一个字符可能存在多个状态的转换。 这种形式上的差异,就造成了2种自动机对语言的识别方式、识别速度的不同。
1.DFA识别语言,是对于每一步,识别一个字符,转换为一个确定的状态,最终决定是否匹配。
2.NFA识别语言,是对于每一步,识别一个字符,转换为一个状态,如果最终没有匹配成功,则返回上一个状态,重新识别上一个识别的字符,看是否可以转换为其他的状态。

这就导致虽然NFA虽然特性丰富,但是翻来覆去的识别字符使得速度较慢,并且可能陷入递归调用而导致性能极差。<

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值