简体   繁体   中英

Splitting String based on nth Occurence of a String in Java

How to Split a String based on the nth(Ex: second) occurence of a delimiter.whereas other than the nth occurence ,all other delimiters should be retained

I/P:

 String name="This is my First Line";
 int delimiter=" ";
 int count=3;//This is a dynamic value

O/P:

String firstpart=This is my
String Secondpart=First Line

Due to limitations with regex, you can't split it in 1 line of code, but you can do it in 2 lines:

String firstPart = name.replaceAll("^((.*?" + delimiter + "){" + count + "}).*", "$1");
String secondPart = name.replaceAll("^(.*?" + delimiter + "){" + count + "}(.*)", "$2");

I got it like this

String name="This is my First Line";

 int count=3;

 String s1,s2;

 String arr[]=name.split();//default will be space

 for(i=0;i<arr.length;i++)

   if(i<count)

    s1=s1+arr[i]+" "

   else 

    s2=s2+arr[i]+" "

Just use indexOf to search for the delimiter and repeat that until you found it count -times. Here is a snippet:

String name = "This is my First Line";
String delimiter = " ";
int count = 3;

// Repeativly search for the delimiter
int lastIndex = -1;
for (int i = 0; i < count; i++) {
    // Begin to search from the position after the last matching index
    lastIndex = name.indexOf(delimiter, lastIndex + 1);

    // Could not be found
    if (lastIndex == -1) {
        break;
    }
}

// Get the result
if (lastIndex == -1) {
    System.out.println("Not found!");
} else {
    // Use the index to split
    String before = name.substring(0, lastIndex);
    String after = name.substring(lastIndex);

    // Print the results
    System.out.println(before);
    System.out.println(after);
}

It will now output

This is my
 First Line

Note the whitespace (the delimiter ) at the beginning of the last line, you can omit this if you want by using the following code at the end

// Remove the delimiter from the beginning of 'after'
String after = ...
after = after.subString(delimiter.length());
static class FindNthOccurrence
{
    String delimiter;

    public FindNthOccurrence(String del)
    {
        this.delimiter = del;
    }

    public int findAfter(String findIn, int findOccurence)
    {
        int findIndex = 0;
        for (int i = 0; i < findOccurence; i++)
        {
            findIndex = findIn.indexOf(delimiter, findIndex);
            if (findIndex == -1)
            {
                return -1;
            }
        }
        return findIndex;
    }
}

FindNthOccurrence nth = new FindNthOccurrence(" ");
String string = "This is my First Line";
int index = nth.nthOccurrence(string, 2);
String firstPart = string.substring(0, index);
String secondPart = string.substring(index+1);

Simply like this, Tested and work perfectly in Java 8

public String[] split(String input,int at){
    String[] out = new String[2];
    String p = String.format("((?:[^/]*/){%s}[^/]*)/(.*)",at);
    Pattern pat = Pattern.compile(p);
    Matcher matcher = pat.matcher(input);
       if (matcher.matches()) {
          out[0] = matcher.group(1);// left
          out[1] = matcher.group(2);// right
       }
    return out;
} 

//Ex: D:/folder1/folder2/folder3/file1.txt
//if at = 2, group(1) = D:/folder1/folder2  and group(2) = folder3/file1.txt

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM