我正在尝试创建一个匹配商标百分比的正则表达式
例如,如果我们考虑很少的百分比
1)100%
2)56.78%
3)56 78.90%
4)34.6789%
Run Code Online (Sandbox Code Playgroud)
匹配的百分比应该是
100%
56.78%
34.6789%
Run Code Online (Sandbox Code Playgroud)
我做了一个表达,"\\d.+[\\d]%"但它也匹配56 78.90%我不想要的.
如果有人知道这样的表达请分享
vks*_*vks 13
\\d+(?:\\.\\d+)?%
Run Code Online (Sandbox Code Playgroud)
这应该为你做.
对于更严格的测试用途,
\b(?<!\.)(?!0+(?:\.0+)?%)(?:\d|[1-9]\d|100)(?:(?<!100)\.\d+)?%
Run Code Online (Sandbox Code Playgroud)
见演示.
https://regex101.com/r/zsNIrG/2
你没有对你的点进行双重转义,这意味着它是任何字符的通配符,包括空格。
使用类似的东西:
? 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+)?%"
Run Code Online (Sandbox Code Playgroud)
例如:
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());
}
Run Code Online (Sandbox Code Playgroud)
输出
Found: 100%
Found: 56.78%
Found: 78.90%
Found: 34.6789%
Run Code Online (Sandbox Code Playgroud)
笔记
这仍然匹配第三个输入,但只匹配最后一部分。
如果您希望第三个输入不匹配,您可以用输入边界包围您的模式,例如^输入开始和输入$结束。
那将变成: "^\\d+(\\.\\d+)?%$"
或者,您可以简单地调用Matcher#matches而不是Matcher#find.
下一步
您可能想要对正在检索的数值做一些事情。
在这种情况下,您可以用组 ( "(\\d+(\\.\\d+)?)%")包围您的模式,并在您的反向引用中调用Double.parseDouble或new BigDecimal(...):
Double.parseDouble(m.group(1))new BigDecimal(m.group(1))^((100)|(\d{1,2}(.\d*)?))%$
在这里检查这个正则表达式: https: //regex101.com/r/Ou3mJI/2
您可以使用此正则表达式。它的有效期为:
以下是有效值:
100%有效
99.802%有效
98.7%有效
57%有效
0%有效
此正则表达式使以下值无效:
无效值示例:
-1%
99.989%
101%
56 78.90%
希望这会有所帮助!