java 分数百分比的正则表达式

8wtpewkr  于 2022-12-21  发布在  Java
关注(0)|答案(5)|浏览(258)

我正在尝试创建一个正则表达式来匹配分数的百分比
例如,如果我们考虑很少的百分比

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

匹配的百分比应为

100%
56.78%
34.6789%

我创建了一个表达式"\\d.+[\\d]%",但它也匹配我不想要的56 78.90%
如果有人知道这样的表达请分享

hgncfbus

hgncfbus1#

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

这个应该够你用了。
对于更严格的测试用途,

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

参见演示。
https://regex101.com/r/zsNIrG/2

4zcjmb1e

4zcjmb1e2#

您没有对点进行双转义,这意味着它是任何字符的通配符,包括空格。
使用类似于:

┌ 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%
    • 注**

这仍然匹配第三个输入,但仅匹配最后一部分。
如果希望第三个输入不匹配,可以用输入边界包围模式,例如^表示输入开始,$表示输入结束。
这将成为:"^\\d+(\\.\\d+)?%$"
或者,您可以简单地调用Matcher#matches而不是Matcher#find

    • 下一步**

你可能想对你正在检索的数值做一些事情。
在这种情况下,可以用一个组("(\\d+(\\.\\d+)?)%")包围模式,并在反向引用上调用Double.parseDoublenew BigDecimal(...)

  • Double.parseDouble(m.group(1))
  • new BigDecimal(m.group(1))
j2datikz

j2datikz3#

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

请检查以下正则表达式:https://regex101.com/r/Ou3mJI/2
您可以使用此正则表达式。它适用于:

  1. 0至100(含)
    1.带和不带小数位
    以下是有效值:
    100%有效
    99.802%有效
    98.7%有效
    57%有效
    0%有效
    此正则表达式使以下值无效:
    1.负数
    1.数量〉100
    1.带空格的数字
    无效值示例:
    -1%
    九十九点九八九
    101%
    56人占78.90%
    希望这会有帮助!
nwlqm0z1

nwlqm0z14#

RegEx \\d+(\\.?\\d+)?%可以工作。

c3frrgcw

c3frrgcw5#

这个答案的所有功劳都归于@vks,但我正在寻找一个匹配的正则表达式:

  • 正值在0% - 100%之间
  • 无负值
  • 在任何给定的字符串中

这包括排除负数的负前瞻(?<!-)

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

相关问题