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

时间:2014-12-16 07:43:59

标签: java regex

为什么这会失败?

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

我睡了一夜,但我仍然没有得到它。 我现在得到了一个解决方案:

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

但在我(可能缺乏知识)中,第一个也应该匹配。因为它必须匹配一个完整的字符串,那么' ^'是什么意思呢?一行开头的字符。

2 个答案:

答案 0 :(得分:6)

这是.matches()的反复出现的问题:它被误解了。它不进行正则表达式匹配。问题在于,甚至其他语言也成为了这种错误的牺牲品(python就是一个例子)。

问题在于它会尝试匹配您的整个输入。

使用PatternMatcher.find()代替(.find() 真正的正则表达式匹配,即找到与输入):

private static final Pattern NONDIGIT = Pattern.compile("\\D");

// in code
if (NONDIGIT.matcher(n).find())
    // there is a non digit

你实际上应该使用Pattern; String .matches()每次都会重新编译模式 。使用Pattern时,它只编译一次。

答案 1 :(得分:1)

如果整个字符串与模式匹配,则

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

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