vikash singh
vikash singh

Reputation: 1509

Regex to parse percentage range from given string

I was trying to form regex which should be able to extract percentage range from any String. For example- Adidas 30-60% Off on footwear,

I am able to extract 60% from this string using - \\b\\d+(?:%|percent\\b) , But, this should work for both 56% as well as 30-60%.

Any help will be appriciaed.

Upvotes: 0

Views: 226

Answers (2)

libao zhou
libao zhou

Reputation: 23

public static void main(String[] args) {
        String line = "Adidas 30-60% Off";
        String pattern = "\\b[\\d|-]+(?:%|percent\\b)";

        Pattern r = Pattern.compile(pattern);

        Matcher m = r.matcher(line);
        if (m.find( )) {
            System.out.println("Found value: " + m.group(0) );
        } else {
            System.out.println("NO MATCH");
        }
    }

Upvotes: 0

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 627082

You can use

\b(?:\d+[—–-])?\d+(?:%|percent\b)

With fractions support it may look like

\b(?:\d+(?:\.\d+)?[—–-])?\d+(?:\.\d+)?(?:%|percent\b)

See the regex demo. Details:

  • \b - a word boundary
  • (?:\d+(?:\.\d+)?[—–-])? - an optional sequence of one or more digits followed with an optional sequence of . and one or more digits and then a dash
  • \d+(?:\.\d+)? - one or more digits followed with an optional sequence of . and one or more digits
  • (?:%|percent\b) - % or percent followed with a word boundary.

See a Java demo:

import java.util.regex.*;

class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String s = "both 56% as well as 30-60%.";
        Pattern pattern = Pattern.compile("\\b(?:\\d+[—–-])?\\d+(?:%|percent\\b)");
        Matcher matcher = pattern.matcher(s);
        while (matcher.find()){
            System.out.println(matcher.group()); 
        } 
    }
}

Output:

56%
30-60%

Upvotes: 2

Related Questions