为什么java-regex \ d匹配下划线?我该如何解决?

时间:2014-04-22 15:32:48

标签: java regex

我有这种模式匹配数字(和仅数字)。但不知何故,它似​​乎也匹配下划线。

    Pattern pattern = Pattern.compile("(\\d)*");
    Matcher matcher = pattern.matcher("_");
    System.out.println(matcher.find());

(打印true表示_匹配(\\d)*

这是一个错误???? (我知道下划线现在是数字文字的一部分(从Java 1.7 +开始)

如何更改模式以排除下划线?

编辑:

根据以下建议,我试过[^_]*\\d*(这不起作用,顺便说一句)

6 个答案:

答案 0 :(得分:6)

*表示0次或更多次。所以_匹配0位数。使用+一次或多次。

答案 1 :(得分:5)

修饰符*匹配0个或更多实例。

您可能希望使用+以确保字符串包含数字。

为了否定给定的字符,你可以使用否定的字符类:

[^_]

答案 2 :(得分:1)

与下划线匹配的是*,请尝试此选择:

Pattern pattern = Pattern.compile("(\\d+)");
Matcher matcher = pattern.matcher("_");
System.out.println(matcher.find());

答案 3 :(得分:0)

了解将System.out.println(matcher.group())添加到代码输出中的内容。您只检查find的返回值,如果正则表达式匹配则返回true,但没有说明匹配的字符数。在您的情况下,(\\d)*匹配字符串开头和下划线之间的区域,长度为0的子字符串。

答案 4 :(得分:0)

如果您想检查输入字符串是否匹配您的模式,则应使用matches()代替find()

System.out.println(matcher.matches());

目前在输入字符串中尝试查找“零或更多数字”,但对于任何字符串都会true,因为没有数字的字符串仍然包含“零数字”。

答案 5 :(得分:0)

其他答案提供了理由" _"与正则表达式匹配。 为了满足您的需求,您可以尝试(零个或多个数字)

Pattern pattern = Pattern.compile("(^\\d*$)");


Explanation:

^ is the beginning of string anchor
$ is the end of string anchor
\d is the digit
* is zero-or-more repetition of

如果你在这种情况下使用否定字符(for _),你可能需要添加除number之外的所有情况。这可能不是有效或正确的方式。