大文本的灾难性回溯

时间:2016-05-03 13:21:03

标签: java regex

嗨我有正则表达式允许使用字母数字,逗号(,)和FullStop(。),对于小单词(如10个字符),它工作正常。但是对于大约850个字符的大字,应用程序就悬空了。

以下是我的正则表达式。

/^(([a-zA-Z0-9\s]+[\s,])*\s?[a-zA-Z0-9]+){1}\.{0,1}$/

一些示例文字:

  

出色的沟通技巧,目前与Infosys合作   成员L和D团队,进行V和A培训,进行过程培训   新员工,涉及通话监控,软技能,电子邮件礼仪   培训确定培训需求并制定行动计划   参与准备培训内容,有经验管理   基于能力的培训日历每个月跨越垂直,非常   精力充沛,真诚,对事业有正确的态度,自信   她的做法和明确的愿望,对话和非常擅长   听,似乎是一个团队合作者,并相信采取额外的   倡议,在她经历时推荐更高的薪水   她的评价。良好的教育背景,得分头等   整个,非常稳定的候选人与Infosys合作超过   5年

你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

嵌套量词以及同一\s可以通过正则表达式以多种不同方式匹配的事实打开了灾难性的回溯。此外,还可以进行一些简化。

以下失败的速度要快得多:

^([a-zA-Z0-9]+[\s,]+)*[a-zA-Z0-9]+\.?$

这匹配一个或多个字母数字单词的句子,由空格和/或逗号分隔,并带有可选的最终句点。您作为测试主题发布的文本失败,因为中间有一段时间正则表达式不允许。如果你想在那里允许句点,只需将它添加到字符类:

^([a-zA-Z0-9]+[\s,.]+)*[a-zA-Z0-9]+\.?$