2016-04-21 63 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)是整个正则表达式的匹配。