2016-04-21 51 views
1

我需要根據模式拆分字符串,並且再次需要將它合併回字符串的一部分。例如:根據模式拆分字符串並將其合併回

例如:下面是實際和預期的字符串。

String actualstr="abc.def.ghi.jkl.mno"; 
String expectedstr="abc.mno"; 

當我在下面使用時,我可以存儲在一個數組中,並迭代以獲取它。無論如何,它可以做到簡單而高效。

String[] splited = actualstr.split("[\\.\\.\\.\\.\\.\\s]+"); 

雖然我可以接取基於索引的字符串,有沒有其他方法可以輕鬆地做到這一點。請指教。

+0

當您拆分字符串並存儲在字符串數組中時,原始字符串保持不變。那爲什麼要合併?您可以使用該原始字符串。 –

+0

呃,你只需要在'['和']'內一次''\\'',簡化你的正則表達式到'[\\。\\ s] +'。 –

回答

1

我會用的replaceAll在這種情況下

String actualstr="abc.def.ghi.jkl.mno"; 
String str = actualstr.replaceAll("\\..*\\.", "."); 

這將替換第一個和最後一個.一切與.

你也可以使用拆分

String[] parts = actualString.split("\\."); 
string str = parts[0]+"."+parts[parts.length-1]; // first and last word 
+0

謝謝。適合我:) – Karthik

2

你做不理解正則表達式如何工作。

這裏是沒有逃逸您正則表達式:[\.\.\.\.\.\s]+

你有一個字符類([])。這意味着沒有理由在其中有多於一個.。您也不需要在char類中轉義.

這是一個相當於你的正則表達式的正則表達式:[.\s]+。作爲一個Java String:"[.\\s]+"


你可以對你的字符串做.split("regex")來得到一個數組。從這一點獲得解決方案非常簡單。

+0

哦,我的壞。謝謝你的意見。 :) – Karthik

1
public static String merge(String string, String delimiter, int... partnumbers) 
{ 
    String[] parts = string.split(delimiter); 

    String result = ""; 

    for (int x = 0 ; x < partnumbers.length ; x ++) 
    { 
     result += result.length() > 0 ? delimiter.replaceAll("\\\\","") : ""; 
     result += parts[partnumbers[x]]; 
    } 

    return result; 
} 

,然後用它喜歡:

merge("abc.def.ghi.jkl.mno", "\\.", 0, 4); 
1

我會做這樣

Pattern pattern = Pattern.compile("(\\w*\\.).*\\.(\\w*)"); 
    Matcher matcher = pattern.matcher("abc.def.ghi.jkl.mno"); 
    if (matcher.matches()) { 
     System.out.println(matcher.group(1) + matcher.group(2)); 
    } 

如果你可以緩存的

Pattern.compile("(\\w*\\.).*\\.(\\w*)") 

結果和重用「模式「重新這個代碼將是非常有效的ent作爲模式編譯是最昂貴的。如果模式長度大於1,其他答案建議的java.lang.String.split()方法在內部使用相同的Pattern.compile()。這意味着它將在每次調用方法時執行模式編譯的昂貴操作。見java.util.regex - importance of Pattern.compile()?。所以將模式編譯並緩存和重用會更好。 matcher.group(1)指的是第一個(),它是「(\ w * \。)」。

儘管我們在這裏沒有使用它,只是注意到組(0)是整個正則表達式的匹配。