Java中十进制数字的正则表达式是什么?

7

我并不确定在Java中正确的句点正则表达式是什么。以下是我的一些尝试,但遗憾的是,它们都表示任何字符。

String regex = "[0-9]*[.]?[0-9]*";
String regex = "[0-9]*['.']?[0-9]*";
String regex = "[0-9]*["."]?[0-9]*";
String regex = "[0-9]*[\.]?[0-9]*";
String regex = "[0-9]*[\\.]?[0-9]*";
String regex = "[0-9]*.?[0-9]*";
String regex = "[0-9]*\.?[0-9]*";
String regex = "[0-9]*\\.?[0-9]*";

我需要的是实际的"."字符本身,有人有想法吗?
我真正想做的是编写一个用于非负实数(允许小数)的正则表达式。因此可能的情况是:12.2、3.7、2.、0.3、.89、19。
String regex = "[0-9]*['.']?[0-9]*";
Pattern pattern = Pattern.compile(regex);

String x = "5p4";
Matcher matcher = pattern.matcher(x);
System.out.println(matcher.find());

最后一行应该输出false,但它仍然输出true。我认为我的正则表达式有问题。

在你的所有示例中,你已经用 ? 使其可选。这就是你想要的吗?句号只需用 \. 即可,无需使用括号或其他任何符号。 - Cfreak
尝试运行 System.out.println("scary.wombat".replaceAll("\\.", "_")); - Scary Wombat
如果你只想要一个句号,为什么周围还有数字? - OneCricketeer
请注意matcher.find()matcher.matches()之间的区别 - find()不适用于完整的区域。 - Disc-Addict
1
最好的答案,可以在这里找到研究论文:https://dev59.com/83E85IYBdhLWcg3wXCS1#39399503 - Gangnus
5个回答

9

更新

为匹配非负十进制数,需要使用以下正则表达式:

^\d*\.\d+|\d+\.\d*$

或者用Java语法表达为:"^\\d*\\.\\d+|\\d+\\.\\d*$"

String regex = "^\\d*\\.\\d+|\\d+\\.\\d*$"
String string = "123.43253";

if(string.matches(regex))
    System.out.println("true");
else
    System.out.println("false");

你原始的正则表达式尝试的解释:

[0-9]*\.?[0-9]*

使用Java转义后变为:

"[0-9]*\\.?[0-9]*";

如果您需要将点号设为必填项,则需要删除问号:
[0-9]*\.[0-9]*  

但是它也可以接受一个点而没有任何数字...因此,如果您希望验证考虑数字为必填项,您应该使用+(表示一个或多个)而不是*(表示零个或多个)。 这种情况下,它变成了:

[0-9]+\.[0-9]+

1
如果您使用Kotlin,请使用ktx:
fun String.findDecimalDigits() =
    Pattern.compile("^[0-9]*\\.?[0-9]*").matcher(this).run { if (find()) group() else "" }!!

1
你最初的理解可能是正确的,但当使用matcher.find()时,你的正则表达式将在字符串中找到第一个有效匹配项,并且所有的示例都会匹配零长度字符串。
我建议使用"^([0-9]+\\.?[0-9]*|\\.[0-9]+)$"

0

我已经测试了所有的情况。

public static boolean isDecimal(String input) {
        return Pattern.matches("^[-+]?\\d*[.]?\\d+|^[-+]?\\d+[.]?\\d*", input);
}

0

实际上有两种方法可以匹配字面意义的.。一种是使用反斜杠转义,就像你在这里使用的\\.,另一种方法是将其包含在字符类或方括号中,例如[.]大多数特殊字符在方括号内变成字面字符,包括.。因此,如果你只想匹配一个字面点.,使用\\.可以更清晰地表达你的意图,而不是使用[.]。如果你需要匹配多个表示匹配这个或者那个的东西,例如这个正则表达式[\\d.]表示匹配一个数字或一个字面点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接