sirvon
sirvon

Reputation: 2625

Split string on the last occurrence of some character

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.

Upvotes: 47

Views: 92063

Answers (7)

ar10a
ar10a

Reputation: 41

You can use StringUtils from apache commons, which is an elegant way of extracting file type.

    String example = "/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 format = StringUtils.substringAfterLast(example, ".");
    System.out.println(format);

Program will print "mp3" in the console.

Upvotes: 4

Jose Duarte
Jose Duarte

Reputation: 129

For an arbitrary splitting string c of any length:

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

Upvotes: 0

Jon Senchyna
Jon Senchyna

Reputation: 8047

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)

Upvotes: 4

user1537366
user1537366

Reputation: 1187

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.

Upvotes: 33

Kei Minagawa
Kei Minagawa

Reputation: 4501

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

Upvotes: 7

Evgeniy Dorofeev
Evgeniy Dorofeev

Reputation: 136002

You can try this

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

Upvotes: 71

Juned Ahsan
Juned Ahsan

Reputation: 68715

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];
        }

Upvotes: 1

Related Questions