根据模式拆分字符串并将其合并

时间:2016-04-21 21:12:45

标签: java string split

我需要根据模式拆分字符串,然后我需要将其合并回字符串的一部分。

for ex:下面是实际和预期的字符串。

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

当我在下面使用时,我可以存储在一个数组中并迭代以取回它。无论如何,它可以比下面简单有效。

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

虽然我可以根据索引访问字符串,但还有其他方法可以轻松完成此操作。请指教。

4 个答案:

答案 0 :(得分:2)

你不明白正则表达式如何运作。

这是没有转义的正则表达式:[\.\.\.\.\.\s]+

你有一个角色类([])。这意味着没有理由在其中包含多个.。您也不需要在char类中转义.

以下是正则表达式的等效正则表达式:[.\s]+。作为Java字符串:"[.\\s]+"

您可以对字符串执行.split("regex")以获取数组。从那时起获得解决方案非常简单。

答案 1 :(得分: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

答案 2 :(得分: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);

答案 3 :(得分: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*)") 

并重新使用“模式”这个代码将非常有效,因为模式编译是最昂贵的。其他答案建议使用的java.lang.String.split()方法如果模式长度大于1,则在内部使用相同的Pattern.compile()。这意味着它将在每次调用方法时执行这种昂贵的模式编译操作。见java.util.regex - importance of Pattern.compile()?。因此,编译和缓存并重用模式会好得多。

matcher.group(1)引用第一组(),即“(\ w * \。)” matcher.group(2)指的是第二个“(\ w *)”

即使我们不在这里使用它,但只是要注意group(0)是整个正则表达式的匹配。