2013-07-02 39 views
0

模式:Java的正則表達式導致掛起線程

"(([^",\n ]*[,\n ])*([^",\n ]*"{2})*)*[^",\n ]*"[ ]*,[ ]*|[^",\n]*[ ]*,[ ]*|"(([^",\n ]*[,\n ])*([^",\n ]*"{2})*)*[^",\n ]*"[ ]*|[^",\n]*[ ]* 

這正則表達式是用於解析CSV文件。但是當它進入Pattern.matcher時,我遇到了一個掛起的線程異常。欣賞它,如果有人可以幫助微調這種模式。

[7/1/13 16:45:26:745 GMT+08:00] 00000029 ThreadMonitor W WSVR0605W: Thread "MessageListenerThreadPool : 0" (00000035) has been active for 691836 milliseconds and may be hung. There is/are 1 thread(s) in total in the server that may be hung. 
at java.util.regex.Pattern$Curly.match(Pattern.java:4233) 
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4606) 
at java.util.regex.Pattern$Loop.matchInit(Pattern.java:4752) 
at java.util.regex.Pattern$Prolog.match(Pattern.java:4689) 
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4606) 
at java.util.regex.Pattern$Loop.match(Pattern.java:4733) 
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4665) 
at java.util.regex.Pattern$Loop.matchInit(Pattern.java:4754) 
at java.util.regex.Pattern$Prolog.match(Pattern.java:4689) 
at java.util.regex.Pattern$Loop.match(Pattern.java:4742) 
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4665) 
at java.util.regex.Pattern$BitClass.match(Pattern.java:2912) 
at java.util.regex.Pattern$Curly.match0(Pattern.java:4278) 
at java.util.regex.Pattern$Curly.match(Pattern.java:4233) 
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4606) 
at java.util.regex.Pattern$Loop.matchInit(Pattern.java:4752) 
at java.util.regex.Pattern$Prolog.match(Pattern.java:4689) 
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4606) 
+1

,我們將不能夠微調您的正則表達式,除非你告訴我們,需要 – Anirudha

回答

0

說明

這個問題似乎是正在做以完成匹配回跟蹤的剪切量。

如果您的CSV格式正確,您可以使用更簡單的正則表達式來解析每一行。請注意,這隻會將逗號和逗號分隔的值與字符串分開,因此您需要將每行通過.matcher與此正則表達式並遍歷每個匹配項。

正則表達式:(?:^|,)"?((?<=")[^"]*|[^,"]*)"?(?=,|$)

enter image description here

的Java代碼示例:

活生生的例子:http://ideone.com/NBmzrk

示例文字

"root",test1,1111,"22,22",,fdsa 

代碼

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 
class Module1{ 
    public static void main(String[] asd){ 
    String sourcestring = "source string to match with pattern"; 
    Pattern re = Pattern.compile("(?:^|,)\"?((?<=\")[^\"]*|[^,\"]*)\"?(?=,|$)",Pattern.CASE_INSENSITIVE); 
    Matcher m = re.matcher(sourcestring); 
    int mIdx = 0; 
    while (m.find()){ 
     for(int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++){ 
     System.out.println("[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx)); 
     } 
     mIdx++; 
    } 
    } 
} 

捕獲組1

[0] => root 
[1] => test1 
[2] => 1111 
[3] => 22,22 
[4] => 
[5] => fdsa 
+0

我已經改變了使用精確的輸入和輸出opencsv解析CSV文件。謝謝你的建議。 – user18384