2012-11-12 97 views
2

我有一個這樣的字符串:分割字符串返回只有後者部分

 
abc:def,ghi,jkl;mno:pqr,stu;vwx:yza,aaa,bbb; 

我想在第一次分裂;然後在: 最後輸出應該是隻有後者的部分周圍:即我的輸出應該是

def, ghi, jkl, pqr, stu, yza,aaa,bbb

這可以通過拆分與;兩次,即一次完成,然後用:然後模式匹配只要找到:旁邊的右側部分。 Howvever,有沒有更好的和優化的解決方案來實現這一點?

+1

請附上您的代碼,否則你的問題是關閉主題(如[fa Q])。 – Adam

+0

我建議使用正則表達式而不是split.Agree和Rohit Jain的答案。 – Raghunandan

+0

@ user1703096,你通常不接受答案。太糟糕了! – TheBlastOne

回答

3
String[] tabS="abc:def,ghi,jkl;mno:pqr,stu;vwx:yza,aaa,bbb;".split(";"); 
StringBuilder sb = new StringBuilder(); 
Pattern patt = Pattern.compile("(.*:)(.*)"); 
String sep = ","; 
for (String string : tabS) { 
    sb.append(patt.matcher(string).replaceAll("$2 ")); // ' ' after $2 == ';' replaced 
    sb.append(sep); 
} 
System.out.println(sb.substring(0,sb.lastIndexOf(sep))); 

輸出

def,ghi,jkl ,pqr,stu ,yza,aaa,bbb 
0

,除非你有在Java不要模式匹配;如果字段名稱中沒有':'字符(示例中爲abc),則可以使用indexOf(":")來確定「正確部分」。

6

所以基本上你想獲取;:之間的內容,與:左側和;在右邊。

你可以使用這個表達式: -

"(?<=:)(.*?)(?=;)" 

這包含:一個look-behind;一個look-ahead。並匹配前面有colon(:)的字符串,然後是semi-colon (;)

正則表達式說明: -

(?<=   // Look behind assertion. 
    :  // Check for preceding colon (:) 
)    
(   // Capture group 1 
    .  // Any character except newline 
    *  // repeated 0 or more times 
    ?  // Reluctant matching. (Match shortest possible string) 
) 
(?=   // Look ahead assertion 
    ;  // Check for string followed by `semi-colon (;)` 
) 

這裏的工作代碼: -

String str = "abc:def,ghi,jkl;mno:pqr,stu;vwx:yza,aaa,bbb;"; 

    Matcher matcher = Pattern.compile("(?<=:)(.*?)(?=;)").matcher(str); 

    StringBuilder builder = new StringBuilder(); 
    while (matcher.find()) { 
     builder.append(matcher.group(1)).append(", "); 
    } 

    System.out.println(builder.substring(0, builder.lastIndexOf(","))); 

OUTPUT: -

def,ghi,jkl, pqr,stu, yza,aaa,bbb 
+0

+1,更優雅 –

+0

有沒有一種工具可以生成RegexExplanation部分,還是您手動輸入的?一個工具對初學者非常有用。 –

+0

@CoryKendall ..我只用手輸入。但是有很多在線的'正則表達式'資源。我想你可以谷歌了。你會得到很多。 :) –