Java 正则表达式检查字符串是否包含非数字失败

Java 正则表达式检查字符串是否包含非数字失败,java,regex,Java,Regex,为什么会失败 String n = "h107"; if (n.matches("\\D+")) { System.out.println("non digit in it"); } 我为此睡了一夜,但还是不明白。 我现在有了一个解决方案: if (n.matches(".*\\D+.*")) { 但在我看来(可能缺乏知识),第一个也应该匹配。原因如果它必须匹配一个完整的字符串,那么行开头的“^”字符有什么意义。这是.matches()的反复出现的问题:它命名错误。它不进行正则表达式匹配

为什么会失败

String n = "h107";
if (n.matches("\\D+")) {
  System.out.println("non digit in it");
}
我为此睡了一夜,但还是不明白。 我现在有了一个解决方案:

if (n.matches(".*\\D+.*")) {

但在我看来(可能缺乏知识),第一个也应该匹配。原因如果它必须匹配一个完整的字符串,那么行开头的“^”字符有什么意义。

这是
.matches()
的反复出现的问题:它命名错误。它不进行正则表达式匹配。问题是,甚至其他语言也受到了这种错误命名的影响(python就是一个例子)

问题是它会试图匹配您的全部输入

使用
模式
匹配器
查找()
.find()
进行真正的正则表达式匹配,即查找与输入中任何位置匹配的文本):

实际上,您应该使用
模式
String
.matches()
每次都会重新编译一个模式。对于
模式
只编译一次。

如果整个字符串与模式匹配,则返回true。只需将正则表达式更改为
\d+
,如果整个字符串由数字组成,则返回true:

String n = "h107";
if (!n.matches("\\d+")) {
     System.out.println("non digit in it");
}

很难不指出这只是另一个迟钝的java API来回答…@dystroy如果“迟钝”就像“命名错误”一样,那么我完全同意;)否则,当你正确使用它的时候,它是非常漂亮的good@fge这是一个错误的命名和设计选择。在这里使用标准的正则表达式约定可以让我们决定何时匹配整个字符串,而无需借助详细的模式API进行简单检查。与使用
模式相比,这是一个非常昂贵的解决方案。但是《太阳报》制作的api完全是废话。好吧,嘿,一旦你掌握了窍门,你就忘了它有多“古怪”;)总之,从各方面考虑,Java的正则表达式引擎非常好。而
模式
匹配器
之间的逻辑分离是有意义的。但是,是的,我希望方法名称更好。就像很多人一样。。。
String n = "h107";
if (!n.matches("\\d+")) {
     System.out.println("non digit in it");
}