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
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.
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.
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).
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))
^((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:
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:
Invalid value examples:
-1%
99.989%
101%
56 78.90%
Hope this will help!
\\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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With