Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于模式拆分字符串并将其合并回_Java_String_Split - Fatal编程技术网

Java 基于模式拆分字符串并将其合并回

Java 基于模式拆分字符串并将其合并回,java,string,split,Java,String,Split,我需要根据一个模式拆分一个字符串,然后再次将它合并回字符串的一部分 例如:下面是实际字符串和预期字符串 String actualstr="abc.def.ghi.jkl.mno"; String expectedstr="abc.mno"; 当我使用下面的代码时,我可以将其存储在一个数组中,然后迭代以获取它。无论如何,有没有比下面更简单有效的方法呢 String[] splited = actualstr.split("[\\.\\.\\.\\.\\.\\s]+"); 虽然我可以基于索引访

我需要根据一个模式拆分一个字符串,然后再次将它合并回字符串的一部分

例如:下面是实际字符串和预期字符串

String actualstr="abc.def.ghi.jkl.mno";
String expectedstr="abc.mno";
当我使用下面的代码时,我可以将其存储在一个数组中,然后迭代以获取它。无论如何,有没有比下面更简单有效的方法呢

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

虽然我可以基于索引访问字符串,但是有没有其他方法可以轻松做到这一点。请告知。

在这种情况下,我会使用替换球

String actualstr="abc.def.ghi.jkl.mno";
String str = actualstr.replaceAll("\\..*\\.", ".");
这将用第一个和最后一个
替换所有内容

您也可以使用split

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

在这种情况下,我会用一个替代品

String actualstr="abc.def.ghi.jkl.mno";
String str = actualstr.replaceAll("\\..*\\.", ".");
这将用第一个和最后一个
替换所有内容

您也可以使用split

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

您不了解正则表达式是如何工作的

这是不带转义符的正则表达式:
[\.\.\.\.\.\.\.\..\s]+

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

这里有一个与正则表达式等价的正则表达式:
[。\s]+
。作为Java字符串,它是:
“[.\\s]+”



您可以对字符串执行
.split(“regex”)
,以获得数组。从这一点上得到解决方案非常简单。

您不了解正则表达式是如何工作的

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;
}
这是不带转义符的正则表达式:
[\.\.\.\.\.\.\.\..\s]+

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

这里有一个与正则表达式等价的正则表达式:
[。\s]+
。作为Java字符串,它是:
“[.\\s]+”



您可以对字符串执行
.split(“regex”)
,以获得数组。从这一点上得到解决方案非常简单。

我会这样做

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;
}
    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()方法在内部使用相同的Pattern.compile(),前提是模式长度大于1。这意味着它将在每次调用该方法时执行这种昂贵的模式编译操作。看见因此,对模式进行编译、缓存和重用要好得多

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


尽管我们在这里不使用它,但请注意组(0)是整个正则表达式的匹配项。

我会这样做

    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()方法在内部使用相同的Pattern.compile(),前提是模式长度大于1。这意味着它将在每次调用该方法时执行这种昂贵的模式编译操作。看见因此,对模式进行编译、缓存和重用要好得多

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


尽管我们在这里不使用它,但请注意,组(0)是整个正则表达式的匹配项。

拆分字符串并存储在字符串数组中时,原始字符串保持不变。那么为什么要合并呢?您可以使用原始字符串。您只需在
[
]
中使用
\.
一次,即可将正则表达式简化为
[\\.\\s]+
。拆分字符串并存储在字符串数组中时,原始字符串保持不变。那为什么合并?您可以使用原始字符串。嗯,您只需要在
[
]
中使用
\\.
一次,就可以将正则表达式简化为
[\\.\\s]+
。哦,糟糕。谢谢您的评论。:)哦,糟糕。谢谢您的评论。:)非常感谢。为我工作:)谢谢。为我工作:)