2017-09-05 172 views
1

我有这样的正则表达式比平常更长一点。我尝试在文本文档中捕捉一些值。Java正则表达式模式太长?

\\n*.*(k\\s=\\s\\d)(.|\\n)*?estimate\\s.*\\n*\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s+ 

它适用于regexr.com link

但在Java完美的罚款只有这部分,只要我添加缺少的 'E' 它停止工作工作

\\n*.*(k\\s=\\s\\d)(.|\\n)*?estimat 

现在我忽略了一些群体被错误填写。

错在何处?

+2

听起来不可思议,你可以张贴的再现它的Java代码片段? – Aaron

+1

观看输入字符串。 – revo

+1

在你的情况我会首先完全分裂的文本与正则表达式,那么我会分析你有兴趣与第二正则表达式或更多的值。使用单个正则表达式做所有事情都是痛苦的$$ – Oneiros

回答

3

(.|\\n)*?使得正则表达式引擎进行太多的冗余回溯步骤。您需要用(?s:.*?)替换您的模式中的所有这些部分,该修饰符组匹配任何0+字符(包括换行符字符)。由于没有交替,所以这里没有多余的回溯。

注意,在JavaScript(如你在regexr.com测试模式,只有支持JavaScript的正则表达式的味道),该(.|\n)*?[^]*?[\s\S]*?为正则表达式引擎根本不支持嵌入式修饰符来代替。