6

我不太确定 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。我认为我的正则表达式是错误的。

4

5 回答 5

8

更新

要匹配非负十进制数,您需要此正则表达式:

^\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]+
于 2017-03-29T04:46:13.070 回答
0

实际上有两种方法可以匹配文字.。一种是像你在那儿那样使用反斜杠转义\\.,另一种方法是将它括在字符类或方括号中,如[.]. 大多数特殊字符变成方括号内的文字字符,包括.. 所以 use比你想要的只是匹配一个文字点\\.更清楚地表明你的意图。如果您需要匹配多个表示匹配这个那个的事物,例如此正则表达式表示匹配单个数字或文字点,请使用[.].[][\\d.]

于 2017-03-29T04:56:00.410 回答
0

如果您使用 Kotlin,请使用 ktx:

fun String.findDecimalDigits() =
    Pattern.compile("^[0-9]*\\.?[0-9]*").matcher(this).run { if (find()) group() else "" }!!
于 2019-03-01T15:25:41.143 回答
0

您最初的理解可能是正确的,但是您被抛出,因为使用 时matcher.find(),您的正则表达式将在字符串中找到第一个有效匹配项,并且您的所有示例都将匹配一个零长度的字符串。

我会建议"^([0-9]+\\.?[0-9]*|[0-9]*\\.[0-9]+)$"

于 2017-03-29T05:34:34.837 回答
0

我已经测试了所有案例。

public static boolean isDecimal(String input) {
        return Pattern.matches("^[-+]?\\d*[.]?\\d+|^[-+]?\\d+[.]?\\d*", input);
}
于 2021-09-07T03:06:58.877 回答