我有这种模式匹配数字(和仅数字)。但不知何故,它似乎也匹配下划线。
Pattern pattern = Pattern.compile("(\\d)*");
Matcher matcher = pattern.matcher("_");
System.out.println(matcher.find());
(打印true
表示_
匹配(\\d)*
)
这是一个错误???? (我知道下划线现在是数字文字的一部分(从Java 1.7 +开始)
如何更改模式以排除下划线?
编辑:
根据以下建议,我试过[^_]*\\d*
(这不起作用,顺便说一句)
答案 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之外的所有情况。这可能不是有效或正确的方式。