要讀取CSV文件,我在Java中的以下正則表達式:Java RegularExpressions上的「StackOverflowError」是否意味着優化Regex?
Pattern csvline = Pattern.compile("((([^\\\"]|\\\"\\\")+|\\\"([^\\\"]|\\\"\\\")+\\\"))*", Pattern.DOTALL);
這個表達式傳遞this online Regex test。但是,在運行時總是會拋出StackOverflowError
。
經過一番研究,我找到了解決辦法是
Pattern csvline = Pattern.compile("((([^\\\"]|\\\"\\\")++|\\\"([^\\\"]|\\\"\\\")++\\\"))*", Pattern.DOTALL);
這裏我用的佔有慾量詞,而不是貪心的孩子來代替表達。在這種情況下,它也是一種優化。
我的問題是,是因爲Java不能處理很多回溯(它消耗堆棧空間,我認爲這是一個好的引擎不應該這樣),所以任何時候當你看到由正則表達式引起的StackOverflowError
時,你應該考慮優化以減少回溯?
只是好奇......這個正則表達式支持像'word1,word2,'word3和word4''嗎? – 2013-02-21 06:17:22
爲什麼你需要附加的括號?相同的正則表達式:'(([^ \\\「] | \\\」\\\「)+ | \\\」([^ \\\「] | \\\」\\\「)+ \ \\「)*' – pstr 2013-02-21 06:22:51
@OscarMederos是的,這只是故事的一部分。這個表達只是爲了確定當前線路是「真實」線路的一部分。如果引用字段包含換行符,則「當前」行將需要與以下行結合使用。所以該算法是在進行額外處理之前重建整條線。 – 2013-02-21 21:35:37