Rajeev Sahu
Rajeev Sahu

Reputation: 1732

Pattern to extract text between parenthesis

How to extract string from "(" and ")" using pattern matching or anything. For example if the text is

"Hello (Java)"

Then how to get only "Java"?

Upvotes: 40

Views: 111208

Answers (4)

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626748

You should actually be using

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("\\(([^()]*)\\)");
Matcher regexMatcher = regex.matcher("Hello This is (Java) Not (.NET)");

while (regexMatcher.find()) {
   matchList.add(regexMatcher.group(1));
}

for(String str:matchList) {
   System.out.println(str);
}

The \(([^()]*)\) regex matches:

  • \( - a ( char
  • ([^()]*) - Group 1: any zero or more chars other than ( and )
  • \) - a ) char.

The [^()] is a negated character class that makes it impossible to match another ( after initial ( is matched with \(, thus, it ensures the innermost matches between two pairs of parentheses.

See the Java demo online and the regex demo.

Upvotes: 2

Yury
Yury

Reputation: 781

there is something even simpler than using regex:

String result = StringUtils.substringBetween(str, "(", ")");

In your example, result would be returned as "Java". I would recommend the StringUtils library for various kinds of (relatively simple) string manipulation; it handles things like null inputs automatically, which can be convenient.

Documentation for substringBetween(): https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#substringBetween-java.lang.String-java.lang.String-java.lang.String-

There are two other versions of this function, depending on whether the opening and closing delimiters are the same, and whether the delimiter(s) occur(s) in the target string multiple times.

Upvotes: 23

Rahul Tripathi
Rahul Tripathi

Reputation: 172418

Try this:

String x = "Hello (Java)";
Matcher m = Pattern.compile("\\((.*?)\\)").matcher(x);
while (m.find()) {
    System.out.println(m.group(1));
}

or

String str = "Hello (Java)";
String answer = str.substring(str.indexOf("(")+1, str.indexOf(")"));

Upvotes: 92

Akash Thakare
Akash Thakare

Reputation: 22972

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("\\((.*?)\\)");
Matcher regexMatcher = regex.matcher("Hello This is (Java) Not (.NET)");

while (regexMatcher.find()) {//Finds Matching Pattern in String
   matchList.add(regexMatcher.group(1));//Fetching Group from String
}

for(String str:matchList) {
   System.out.println(str);
}

OUTPUT

Java
.NET

What does \\((.+?)\\) mean?

This regular Expression pattern will start from \\( which will match ( as it is reserved in regExp so we need escape this character,same thing for \\) and (.*?) will match any character zero or more time anything moreover in () considered as Group which we are finding.

Upvotes: 43

Related Questions