How to get a string between two characters?

JavaString

Java Problem Overview


I have a string,

String s = "test string (67)";

I want to get the no 67 which is the string between ( and ).

Can anyone please tell me how to do this?

Java Solutions


Solution 1 - Java

There's probably a really neat RegExp, but I'm noob in that area, so instead...

String s = "test string (67)";

s = s.substring(s.indexOf("(") + 1);
s = s.substring(0, s.indexOf(")"));

System.out.println(s);

Solution 2 - Java

A very useful solution to this issue which doesn't require from you to do the indexOf is using Apache Commons libraries.

 StringUtils.substringBetween(s, "(", ")");

This method will allow you even handle even if there multiple occurrences of the closing string which wont be easy by looking for indexOf closing string.

You can download this library from here: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4

Solution 3 - Java

Try it like this

String s="test string(67)";
String requiredString = s.substring(s.indexOf("(") + 1, s.indexOf(")"));

The method's signature for substring is:

s.substring(int start, int end);

Solution 4 - Java

By using regular expression :

 String s = "test string (67)";
 Pattern p = Pattern.compile("\\(.*?\\)");
 Matcher m = p.matcher(s);
 if(m.find())
    System.out.println(m.group().subSequence(1, m.group().length()-1)); 

Solution 5 - Java

Java supports Regular Expressions, but they're kind of cumbersome if you actually want to use them to extract matches. I think the easiest way to get at the string you want in your example is to just use the Regular Expression support in the String class's replaceAll method:

String x = "test string (67)".replaceAll(".*\\(|\\).*", "");
// x is now the String "67"

This simply deletes everything up-to-and-including the first (, and the same for the ) and everything thereafter. This just leaves the stuff between the parenthesis.

However, the result of this is still a String. If you want an integer result instead then you need to do another conversion:

int n = Integer.parseInt(x);
// n is now the integer 67

Solution 6 - Java

In a single line, I suggest:

String input = "test string (67)";
input = input.subString(input.indexOf("(")+1, input.lastIndexOf(")"));
System.out.println(input);`

Solution 7 - Java

You could use apache common library's StringUtils to do this.

import org.apache.commons.lang3.StringUtils;
...
String s = "test string (67)";
s = StringUtils.substringBetween(s, "(", ")");
....

Solution 8 - Java

Test String test string (67) from which you need to get the String which is nested in-between two Strings.

String str = "test string (67) and (77)", open = "(", close = ")";

Listed some possible ways: Simple Generic Solution:

String subStr = str.substring(str.indexOf( open ) + 1, str.indexOf( close ));
System.out.format("String[%s] Parsed IntValue[%d]\n", subStr, Integer.parseInt( subStr ));


> Apache Software Foundation commons.lang3.

StringUtils class substringBetween() function gets the String that is nested in between two Strings. Only the first match is returned.

String substringBetween = StringUtils.substringBetween(subStr, open, close);
System.out.println("Commons Lang3 : "+ substringBetween);

Replaces the given String, with the String which is nested in between two Strings. #395


> Pattern with Regular-Expressions: (\()(.*?)(\)).*

The Dot Matches (Almost) Any Character .? = .{0,1}, .* = .{0,}, .+ = .{1,}

String patternMatch = patternMatch(generateRegex(open, close), str);
System.out.println("Regular expression Value : "+ patternMatch);

Regular-Expression with the utility class RegexUtils and some functions.
      Pattern.DOTALL: Matches any character, including a line terminator.
      Pattern.MULTILINE: Matches entire String from the start^ till end$ of the input sequence.

public static String generateRegex(String open, String close) {
	return "(" + RegexUtils.escapeQuotes(open) + ")(.*?)(" + RegexUtils.escapeQuotes(close) + ").*";
}

public static String patternMatch(String regex, CharSequence string) {
	final Pattern pattern  = Pattern.compile(regex, Pattern.DOTALL);
	final Matcher matcher = pattern .matcher(string);
	
	String returnGroupValue = null;
	if (matcher.find()) { // while() { Pattern.MULTILINE }
		System.out.println("Full match: " + matcher.group(0));
		System.out.format("Character Index [Start:End]«[%d:%d]\n",matcher.start(),matcher.end());
		for (int i = 1; i <= matcher.groupCount(); i++) {
			System.out.println("Group " + i + ": " + matcher.group(i));
			if( i == 2 ) returnGroupValue = matcher.group( 2 );
		}
	}
	return returnGroupValue;
}

Solution 9 - Java

String s = "test string (67)";

int start = 0; // '(' position in string
int end = 0; // ')' position in string
for(int i = 0; i < s.length(); i++) { 
    if(s.charAt(i) == '(') // Looking for '(' position in string
       start = i;
    else if(s.charAt(i) == ')') // Looking for ')' position in  string
       end = i;
}
String number = s.substring(start+1, end); // you take value between start and end

Solution 10 - Java

String result = s.substring(s.indexOf("(") + 1, s.indexOf(")"));

Solution 11 - Java

public String getStringBetweenTwoChars(String input, String startChar, String endChar) {
    try {
        int start = input.indexOf(startChar);
        if (start != -1) {
            int end = input.indexOf(endChar, start + startChar.length());
            if (end != -1) {
                return input.substring(start + startChar.length(), end);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return input; // return null; || return "" ;
}

Usage :

String input = "test string (67)";
String startChar = "(";
String endChar   = ")";
String output = getStringBetweenTwoChars(input, startChar, endChar);
System.out.println(output);
// Output: "67"

Solution 12 - Java

Another way of doing using split method

public static void main(String[] args) {

	
	String s = "test string (67)";
	String[] ss;
	ss= s.split("\\(");
	ss = ss[1].split("\\)");
	
	System.out.println(ss[0]);
}

Solution 13 - Java

Use Pattern and Matcher

public class Chk {

	public static void main(String[] args) {

		String s = "test string (67)";
		ArrayList<String> arL = new ArrayList<String>();
		ArrayList<String> inL = new ArrayList<String>();

		Pattern pat = Pattern.compile("\\(\\w+\\)");
		Matcher mat = pat.matcher(s);

		while (mat.find()) {

			arL.add(mat.group());
			System.out.println(mat.group());

		}

		for (String sx : arL) {

			Pattern p = Pattern.compile("(\\w+)");
			Matcher m = p.matcher(sx);

			while (m.find()) {

				inL.add(m.group());
				System.out.println(m.group());
			}
		}

		System.out.println(inL);

	}

}

Solution 14 - Java

The "generic" way of doing this is to parse the string from the start, throwing away all the characters before the first bracket, recording the characters after the first bracket, and throwing away the characters after the second bracket.

I'm sure there's a regex library or something to do it though.

Solution 15 - Java

The least generic way I found to do this with Regex and Pattern / Matcher classes:

String text = "test string (67)";

String START = "\\(";  // A literal "(" character in regex
String END   = "\\)";  // A literal ")" character in regex

// Captures the word(s) between the above two character(s)
String pattern = START + "(\w+)" + END;

Pattern pattern = Pattern.compile(pattern);
Matcher matcher = pattern.matcher(text);

while(matcher.find()) {
    System.out.println(matcher.group()
        .replace(START, "").replace(END, ""));
}

This may help for more complex regex problems where you want to get the text between two set of characters.

Solution 16 - Java

The other possible solution is to use lastIndexOf where it will look for character or String from backward.

In my scenario, I had following String and I had to extract <<UserName>>

1QAJK-WKJSH_MyApplication_Extract_<<UserName>>.arc

So, indexOf and StringUtils.substringBetween was not helpful as they start looking for character from beginning.

So, I used lastIndexOf

String str = "1QAJK-WKJSH_MyApplication_Extract_<<UserName>>.arc";
String userName = str.substring(str.lastIndexOf("_") + 1, str.lastIndexOf("."));

And, it gives me

<<UserName>>

Solution 17 - Java

String s = "test string (67)";

System.out.println(s.substring(s.indexOf("(")+1,s.indexOf(")")));

Solution 18 - Java

Something like this:

public static String innerSubString(String txt, char prefix, char suffix) {
    
    if(txt != null && txt.length() > 1) {

        int start = 0, end = 0;
        char token;
        for(int i = 0; i < txt.length(); i++) {
            token = txt.charAt(i);
            if(token == prefix)
                start = i;
            else if(token == suffix)
                end = i;
        }

        if(start + 1 < end)
            return txt.substring(start+1, end);

    }

    return null;
}

Solution 19 - Java

it will return original string if no match regex

var iAm67 = "test string (67)".replaceFirst("test string \\((.*)\\)", "$1");

add matches to the code

String str = "test string (67)";
String regx = "test string \\((.*)\\)";
if (str.matches(regx)) {
	var iAm67 = str.replaceFirst(regx, "$1");
}

---EDIT---

i use https://www.freeformatter.com/java-regex-tester.html#ad-output to test regex.

turn out it's better to add ? after * for less match. something like this:

String str = "test string (67)(69)";
String regx1 = "test string \\((.*)\\).*";
String regx2 = "test string \\((.*?)\\).*";
String ans1 = str.replaceFirst(regx1, "$1");
String ans2 = str.replaceFirst(regx2, "$1");
System.out.println("ans1:"+ans1+"\nans2:"+ans2); 
// ans1:67)(69
// ans2:67

Solution 20 - Java

This is a simple use \D+ regex and job done.
This select all chars except digits, no need to complicate

/\D+/

Solution 21 - Java

String s = "(69)";
System.out.println(s.substring(s.lastIndexOf('(')+1,s.lastIndexOf(')')));

Solution 22 - Java

Little extension to top (MadProgrammer) answer

 public static String getTextBetween(final String wholeString, final String str1, String str2){
    String s = wholeString.substring(wholeString.indexOf(str1) + str1.length());
    s = s.substring(0, s.indexOf(str2));
    return s;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRoshanckView Question on Stackoverflow
Solution 1 - JavaMadProgrammerView Answer on Stackoverflow
Solution 2 - JavaPini CheyniView Answer on Stackoverflow
Solution 3 - Javauser2656003View Answer on Stackoverflow
Solution 4 - JavaGrisha WeintraubView Answer on Stackoverflow
Solution 5 - JavaDaoWenView Answer on Stackoverflow
Solution 6 - JavaRainyView Answer on Stackoverflow
Solution 7 - JavaChaitanyaBhattView Answer on Stackoverflow
Solution 8 - JavaYashView Answer on Stackoverflow
Solution 9 - JavaPiotr ChojnackiView Answer on Stackoverflow
Solution 10 - JavatechlearnerView Answer on Stackoverflow
Solution 11 - JavaS.RView Answer on Stackoverflow
Solution 12 - JavaJayyView Answer on Stackoverflow
Solution 13 - JavaKumar Vivek MitraView Answer on Stackoverflow
Solution 14 - JavaJonathon AshworthView Answer on Stackoverflow
Solution 15 - JavaTobeView Answer on Stackoverflow
Solution 16 - JavaRaviView Answer on Stackoverflow
Solution 17 - JavaVinodView Answer on Stackoverflow
Solution 18 - JavaAhmad AlMughrabiView Answer on Stackoverflow
Solution 19 - JavabigiCrabView Answer on Stackoverflow
Solution 20 - JavaPascal TovoheryView Answer on Stackoverflow
Solution 21 - Javanitish kumarView Answer on Stackoverflow
Solution 22 - JavabeginnerView Answer on Stackoverflow