148

I have a string (which is basically a file name following a naming convention) abc.def.ghi

I would like to extract the substring before the first . (ie a dot)

In java doc api, I can't seem to find a method in String which does that.
Am I missing something? How to do it?

0

12 Answers 12

161

The accepted answer is correct but it doesn't tell you how to use it. This is how you use indexOf and substring functions together.

String filename = "abc.def.ghi"; // full file name int iend = filename.indexOf("."); //this finds the first occurrence of "." //in string thus giving you the index of where it is in the string // Now iend can be -1, if lets say the string had no "." at all in it i.e. no "." is found. //So check and account for it. String subString; if (iend != -1) { subString= filename.substring(0 , iend); //this will give abc } 
Sign up to request clarification or add additional context in comments.

2 Comments

This is invalid code because you can't put a variable declaration in the body of an If Statement without braces.
@Clashoft the braces are implied here.
108

You can just split the string..

public String[] split(String regex) 

Note that java.lang.String.split uses delimiter's regular expression value. Basically like this...

String filename = "abc.def.ghi"; // full file name String[] parts = filename.split("\\."); // String array, each element is text between dots String beforeFirstDot = parts[0]; // Text before the first dot 

Of course, this is split into multiple lines for clairity. It could be written as

String beforeFirstDot = filename.split("\\.")[0]; 

Comments

95

If your project already uses commons-lang, StringUtils provide a nice method for this purpose:

String filename = "abc.def.ghi"; String start = StringUtils.substringBefore(filename, "."); // returns "abc" 

see javadoc [2.6] [3.1]

Comments

89

look at String.indexOf and String.substring.

Make sure you check for -1 for indexOf.

Comments

13

or you may try something like

"abc.def.ghi".substring(0,"abc.def.ghi".indexOf(c)-1);

7 Comments

will crash of 'c' is not in the string as indexOf will return -1
@Umer Hayat What if the filename is def.hij.klm? How would your code work then? (Your code only works for this one example - you might as well write a function that returns "abc" - it would work just as well)
@Bohemian:I know there are boundary cases and checks missing. It was a specific a answer to to the specific question and idea was to give the general idea through an example :).
@TofuBeer: Ok, fine there is a confusion earlier "(ie a dot)" wasn't there in actual post. I think and hope my answer gives a general idea to solve this kin of problem.
I would go with: int ix = inString.indexOf('.'); if (ix > -1) inString = inString.substring(0, ix); I do not know why Umer suggested subtracting 1. The second argument of substring is up to but excluding anyway.
|
8

I tried something like this,

String str = "abc.def.ghi"; String strBeforeFirstDot = str.substring(0, str.indexOf('.')); // strBeforeFirstDot = "abc" 

I tried for my example, to extract all char before @ sign in email to extract and provide a username.

3 Comments

I can't believe how much code some have answered with when this is all you need to answer the question.
Yes, this is undoubtedly the correct answer I believe. Anything else is less direct if not way overcomplicating it.
Agreed. And if you're trying to remove the file extension just use str.lastIndexOf('.')
5

How about using regex?

String firstWord = filename.replaceAll("\\..*","") 

This replaces everything from the first dot to the end with "" (ie it clears it, leaving you with what you want)

Here's a test:

System.out.println("abc.def.hij".replaceAll("\\..*", ""); 

Output:

abc 

Comments

2

In java.lang.String you get some methods like indexOf(): which returns you first index of a char/string. and lstIndexOf: which returns you the last index of String/char

From Java Doc:

 public int indexOf(int ch) public int indexOf(String str) 

Returns the index within this string of the first occurrence of the specified character.

Comments

2
public void getStrings() { String params = "abc.def.ghi"; String s1, s2, s3; s1 = params.substring(0, params.indexOf(".")); params = params.substring(params.indexOf(".") + 1); s2 = params.substring(0, params.indexOf(".")); params = params.substring(params.indexOf(".") + 1, params.length()); s3 = params; } 

the solution

s1="abc" s2="def" s3="ghi"

IF you have more than 3 String , so then it will look exactly like s2

Comments

1

Here is code which returns a substring from a String until any of a given list of characters:

/** * Return a substring of the given original string until the first appearance * of any of the given characters. * <p> * e.g. Original "ab&cd-ef&gh" * 1. Separators {'&', '-'} * Result: "ab" * 2. Separators {'~', '-'} * Result: "ab&cd" * 3. Separators {'~', '='} * Result: "ab&cd-ef&gh" * * @param original the original string * @param characters the separators until the substring to be considered * @return the substring or the original string of no separator exists */ public static String substringFirstOf(String original, List<Character> characters) { return characters.stream() .map(original::indexOf) .filter(min -> min > 0) .reduce(Integer::min) .map(position -> original.substring(0, position)) .orElse(original); } 

Comments

1

This could help:

public static String getCorporateID(String fileName) { String corporateId = null; try { corporateId = fileName.substring(0, fileName.indexOf("_")); // System.out.println(new Date() + ": " + "Corporate: // "+corporateId); return corporateId; } catch (Exception e) { corporateId = null; e.printStackTrace(); } return corporateId; } 

Comments

0
 private String getTextBefore(final String wholeString, String before){ final int indexOf = wholeString.indexOf(before); if(indexOf != -1){ return wholeString.substring(0, indexOf); } return wholeString; } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.