我正在尝试创建一个匹配标记百分比的正则表达式
例如,如果我们考虑几个百分比
1)100%
2)56.78%
3)56 78.90%
4)34.6789%
匹配的百分比应为
100%
56.78%
34.6789%
我已经制作了一个表达式"\\d.+[\\d]%"
,但它也匹配了我不想要的56 78.90%
。
如果有人知道这样的表达,请分享
答案 0 :(得分:12)
\\d+(?:\\.\\d+)?%
这应该为你做。
对于更严格的测试用途,
\b(?<!\.)(?!0+(?:\.0+)?%)(?:\d|[1-9]\d|100)(?:(?<!100)\.\d+)?%
参见演示。
答案 1 :(得分:4)
你没有双重逃过你的点,这意味着它是任何角色的通配符,包括空格。
使用类似:
┌ 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+)?%"
例如:
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());
}
<强>输出强>
Found: 100%
Found: 56.78%
Found: 78.90%
Found: 34.6789%
注意强>
这仍然匹配第三个输入,但只匹配最后一个部分。
如果您希望第3个输入不匹配,可以使用输入边界包围模式,例如^
表示输入开始,$
表示输入结束。
那将成为:"^\\d+(\\.\\d+)?%$"
或者,您只需调用Matcher#matches
而不是Matcher#find
。
下一步
您可能希望使用您要检索的数值来执行某事。
在这种情况下,您可以使用组("(\\d+(\\.\\d+)?)%"
)包围您的模式,并在您的反向引用上调用Double.parseDouble
或new BigDecimal(...)
:
Double.parseDouble(m.group(1))
new BigDecimal(m.group(1))
答案 2 :(得分:0)
RegEx \\d+(\\.?\\d+)?%
可行。
答案 3 :(得分:0)
<强> ^((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%
希望这会有所帮助!