Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regular Expression for Percentage of marks

Tags:

java

regex

I am trying to create a regex that matches percentage for marks

For example if we consider few percentages

1)100%
2)56.78%
3)56 78.90%
4)34.6789%

The matched percentages should be

100%
56.78%
34.6789%

I have made an expression "\\d.+[\\d]%" but it also matches for 56 78.90% which I don't want.

If anyone knows such expression please share

like image 357
Nishant123 Avatar asked May 06 '15 09:05

Nishant123


People also ask

What is '?' In regular expression?

The '?' means match zero or one space. This will match "Kaleidoscope", as well as all the misspellings that are common, the [] meaning match any of the alternatives within the square brackets.

What is A+ in regular expression?

The character + in a regular expression means "match the preceding character one or more times". For example A+ matches one or more of character A. The plus character, used in a regular expression, is called a Kleene plus . Regular Expression.

What is the regular expression for tab?

You can use special character sequences to put non-printable characters in your regular expression. Use \t to match a tab character (ASCII 0x09), \r for carriage return (0x0D) and \n for line feed (0x0A). More exotic non-printables are \a (bell, 0x07), \e (escape, 0x1B), and \f (form feed, 0x0C).


3 Answers

You haven't double-escaped your dot, which means it's a wildcard for any character, including whitespace.

Use something like:

 ┌ integer part - any 1+ number of digits
 |   ┌ dot and decimal part (grouped)
 |   |┌ double-escaped dot
 |   ||  ┌ decimal part = any 1+ number of digits
 |   ||  |    ┌ 0 or 1 greedy quantifier for whole group
 |   ||  |    |
"\\d+(\\.\\d+)?%"

For instance:

String[] inputs = { "100%", "56.78%", "56 78.90%", "34.6789%" };
Matcher m = null;
for (String s: inputs) {
    m = p.matcher(s);
    if (m.find())
        System.out.printf("Found: %s%n", m.group());
}

Output

Found: 100%
Found: 56.78%
Found: 78.90%
Found: 34.6789%

Note

This still matches the 3rd input, but only the last part.

If you want the 3rd input to just not match, you can surround your pattern with input boundaries, such as ^ for start of input, and $ for end of input.

That would become: "^\\d+(\\.\\d+)?%$"

Or, you can simply invoke Matcher#matches instead of Matcher#find.

Next step

You may want to do something with the numerical value you're retrieving.

In this case, you can surround your pattern with a group ("(\\d+(\\.\\d+)?)%") and invoke either Double.parseDouble or new BigDecimal(...) on your back-reference:

  • Double.parseDouble(m.group(1))
  • new BigDecimal(m.group(1))
like image 59
Mena Avatar answered Oct 01 '22 21:10

Mena


^((100)|(\d{1,2}(.\d*)?))%$

Check this regular expression here: https://regex101.com/r/Ou3mJI/2

You can use this regular expression. It is valid for:

  1. 0 to 100 inclusive
  2. With and without decimal places

Below are valid values:

100% is valid
99.802% is valid
98.7% is valid
57% is valid
0% is valid

This regular expression invalidates below values:

  1. Negative numbers
  2. Number > 100
  3. Number with spaces

Invalid value examples:

-1%
99.989%
101%
56 78.90%

Hope this will help!

like image 20
Saurabh Gupta Avatar answered Oct 01 '22 21:10

Saurabh Gupta


\\d+(?:\\.\\d+)?%

This should do it for you.

For more stringent test use,

\b(?<!\.)(?!0+(?:\.0+)?%)(?:\d|[1-9]\d|100)(?:(?<!100)\.\d+)?%

See demo.

https://regex101.com/r/zsNIrG/2

like image 29
vks Avatar answered Oct 01 '22 21:10

vks