Reputation: 1509
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
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
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