2012-09-24 66 views
0
String input = "2012 AL REG TEXT 300535(NS)"; 
String regex = "^((\\d{4})\\s+)?((\\S+)\\s+(.+?)\\s+)\\s+((\\S+)(\\s+\\(.*?\\)))$"; 

我想在一個組中捕獲2012年,另一個組中包含「AL REG TEXT」,另一個組中包含「300535(NS)」。如何修復這個正則表達式?

+0

太少的信息:什麼是你想要抓住的模式,能有多大,他們偏離。你面臨的問題是什麼? –

+0

和什麼是錯誤? – njzk2

+0

它總是處於上述輸入格式。我試圖捕捉一組4個數字,這是一年,然後是「AL REG TEXT」格式的名稱,另一個數字如「300535(NS)」 – Phoenix

回答

0

錯誤是,你有一個額外的\\s+正好在預期的parantheses之前,作爲@cmonkey指出,在中間額外\\s+。刪除這些,它的作品。此外,只讓你上面提到的組,添加?:到那些你不希望捕捉:

String input = "2012 AL REG TEXT 300535(NS)"; 
String regex = "^(?:(\\d{4})\\s+)?((?:\\S+)\\s+(?:.+?))\\s+((?:\\S+)(?:\\(.*?\\)))$"; 
Matcher m = Pattern.compile(regex).matcher(input); 
if (m.matches()) { 
    for (int i = 1; i <= m.groupCount(); i++) { 
     System.out.format("Group %d: '%s'%n", i, m.group(i)); 
    } 
} 

打印

Group 1: '2012' 
Group 2: 'AL REG TEXT' 
Group 3: '300535(NS)' 
+0

我只對獲取group1,group3,group6感興趣..我可以使這個表達緊湊嗎? – Phoenix

+0

@Phoenix:編輯來解決這個問題。 – Keppil

0

在你的正則表達式的中間,有一部分:

\\s+)\\s+ 

這是尋找兩個必需的連續空格。這不存在,所以正則表達式失敗。

0

試試這個:^(\\d{4})?\\s+(\\D+)\\s+(\\d.*)$

下面的代碼:

String input = "2012 AL REG TEXT 300535(NS)"; 
    String regex = "^(\\d{4})?\\s+(\\D+)\\s+(\\d.*)$"; 

    Pattern p = Pattern.compile(regex); 
    Matcher m = p.matcher(input); 
    if(m.matches()) { 
     System.out.println("Group count: "+m.groupCount()); 
     for(int i=0; i<=m.groupCount(); i++) { 
      System.out.println("Group "+i+": "+m.group(i)); 
     } 
    } 
    else System.out.println("No match");