Split string on the last occurrence of some character

68,268

Solution 1

It might be easier to just assume that files which end with a dot followed by alphanumeric characters have extensions.

int p=filePath.lastIndexOf(".");
String e=filePath.substring(p+1);
if( p==-1 || !e.matches("\\w+") ){/* file has no extension */}
else{ /* file has extension e */ }

See the Java docs for regular expression patterns. Remember to escape the backslash because the pattern string needs the backslash.

Solution 2

You can try this

int i = s.lastIndexOf(c);
String[] a =  {s.substring(0, i), s.substring(i)};

Solution 3

Is this Java? If so, why don't you use "java.io.File.getName".

For example:

File f = new File("/aaa/bbb/ccc.txt");
System.out.println(f.getName());

Out:

ccc.txt

Solution 4

You can use a positive lookahead in your regex to ensure it only splits on the last occurrence. The positive lookahead ensures that it only splits when it does not see another occurrence later in the string.

// Using example filePath from question
String filePath = "/mnt/sdcard/OG Ron C, Chopstars & Drake - Choppin Ain't The Same-2013-MIXFIEND/02 Drake - Connect (Feat. Fat Pat) (Chopped Not Slopped).mp3";
String[] parts = filePath.split("\\.(?=[^.]*$)");
// parts = [
//     "/mnt/sdcard/OG Ron C, Chopstars & Drake - Choppin Ain't The Same-2013-MIXFIEND/02 Drake - Connect (Feat. Fat Pat) (Chopped Not Slopped)"
//     "mp3"
// ]

Breaking down the regex:

  • \\. - Find a period
  • (?=[^.]*$) - make sure everything after is not a period, without including it in the match)

Solution 5

How about splitting the filPath using the period as separator. And taking the last item in that array to get the extension:

        String fileTypeArray[] = filePath.split(",");
        String fileType = "";
        if(fileTypeArray != null && fileTypeArray.length > 0) {
          fileType = fileTypeArray[fileTypeArray.length - 1];
        }
Share:
68,268
sirvon
Author by

sirvon

architecting the future through code.

Updated on October 22, 2020

Comments

  • sirvon
    sirvon over 3 years

    I'm basically trying to split a string on the last period to capture the file extension. But sometimes the file doesn't have any extension, so I'm anticipating that.

    But the problem is that some file names have periods before the end like so...

    /mnt/sdcard/OG Ron C, Chopstars & Drake - Choppin Ain't The Same-2013-MIXFIEND/02 Drake - Connect (Feat. Fat Pat) (Chopped Not Slopped).mp3
    

    So when that string comes up it chops it at "02 Drake - Connect (Feat."

    This is what I've been using...

    String filePath = intent.getStringExtra(ARG_FILE_PATH);
    String fileType = filePath.substring(filePath.length() - 4);
    String FileExt = null;
    try {
        StringTokenizer tokens = new StringTokenizer(filePath, ".");
        String first = tokens.nextToken();
        FileExt = tokens.nextToken();
    }
    catch(NoSuchElementException e) {
        customToast("the scene you chose, has no extension :(");
    }
    System.out.println("EXT " + FileExt);
    File fileToUpload = new File(filePath);
    

    How do I split the string at the file extension but also be able to handle and alert when the file has no extension.

  • Alessio
    Alessio over 10 years
    The \w metacharacter is used to find a word character w3schools.com/jsref/jsref_regexp_wordchar.asp
  • 1615903
    1615903 almost 8 years
    Note that this leaves the splitting character(s) in the beginning of the last string part.
  • Jasmeet Singh
    Jasmeet Singh almost 7 years
    too expensive to build a File object just to parse the name
  • Mac
    Mac over 4 years
    Note that this will fail on files whose names start with a dot and don't have an extension (e.g. .gitignore), which are pretty commonplace on POSIX-based systems. This can be fixed by changing the if condition to check if p is less than or equal to zero.
  • John Calcote
    John Calcote about 3 years
    seriously @jasmeet? Files don't do anything under the covers except parse the name; some methods you may call on them might be expensive, but the constructor is pretty cheap.
  • John Calcote
    John Calcote about 3 years
    This should be the accepted answer. You can also call f.getParent() to get the path portion.
  • h00ligan
    h00ligan over 2 years
    No, this should definitely not be the accepted answer, read the first line in the question: "I'm basically trying to split a string on the last period to capture the file extension."
  • Jose Duarte
    Jose Duarte almost 2 years
    Indeed, the answer should be: int i = s.lastIndexOf(c); String[] a = {s.substring(0, i), s.substring(i+1)};