2017-09-05 160 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]*?爲正則表達式引擎根本不支持嵌入式修飾符來代替。