0

我有以下方法:

protected BigDecimal stringToBigDecimal(String value) throws ParseException
{
    if (Pattern.matches("[\\d,.]+", value))
    {
        Number n = NumberFormat.getInstance().parse(value);

        return new BigDecimal(n.doubleValue());
    }
    else
    {
        throw new ParseException("Invalid String", -1);
    }
}

此值引发异常(如预期),因此此 regExpr 有效:

String wrongAmount = "1,U35,345.43";

但是当我尝试这个时:

protected BigDecimal stringToBigDecimal(String value) throws ParseException
{
    if (Pattern.matches("[\\D&&[^.,]]+", value))
    {
        throw new ParseException("Invalid String", -1);
    }

    Number n = NumberFormat.getInstance().parse(value);

    return new BigDecimal(n.doubleValue());
}

没有抛出异常,但为什么呢?首先,我认为“except for”表达式存在逻辑问题,所以我用这种模式尝试了这个值:

String wrongAmount = "1U3534543";

protected BigDecimal stringToBigDecimal(String value) throws ParseException
{
    if (Pattern.matches("[\\D]+", value))
    {
        throw new ParseException("Invalid String", -1);
    }

    Number n = NumberFormat.getInstance().parse(value);

    return new BigDecimal(n.doubleValue());
}

...但这不匹配?我对“非数字表达”有什么理解错误\\D.。该值包含一个“U”,为什么它不匹配?

4

3 回答 3

2

让我们剖析您的每一种模式:

Pattern.matches("[\\d,.]+", value)

匹配由一个或多个数字、逗号和点组成的任何字符串。

Pattern.matches("[\\D&&[^.,]]+", value)

你不能像你在这里做的那样“组合”字符类。你真正想说的[\\D&&[^.,]]是“匹配任何非数字字符,除了点和逗号。” 编写该正则表达式的正确方法是:

[^\\d,.]   # match anything but digits, comma and dot

最后但并非最不重要的:

Pattern.matches("[\\D]+", value)

这意味着:“匹配一个非空字符串完全由非数字字符组成。”

Pattern.matches()尝试将整个字符串与正则表达式进行匹配。Matcher.find()如果您尝试仅匹配字符串的一部分,则希望使用。

最后,您误解了+工作原理。+是一个量词,表示“1 或更多”。它没有做你认为它正在做的事情。

于 2012-04-04T13:08:12.167 回答
0

你没有正确地否定你的表达。

在第一个示例中,您说“如果我的输入仅匹配数字、逗号和点”,那么就可以了。

在您的第二个示例中(我不确定它是否符合您的意思,但那是另一回事),您的意思是说“如果输入仅匹配非数字、非逗号、非点字符”,但您的输入包含数字,所以匹配不起作用。

在你的最后一个例子中,同样的事情,你说“如果输入只匹配非数字字符”但是你的输入中再次有数字

于 2012-04-04T13:10:22.213 回答
0

我想你想要这个:

if (value.matches(".*[^\\d.,].*")) {
    throw new ParseException("Invalid String", -1);
}

注意添加".*"到前面和后面,因为仅当模式与整个输入匹配时才String.matches()返回。true

但是我会将其更改为否定匹配,因为它更易于阅读:

if (!value.matches("[\\d.,]+")) {
    throw new ParseException("Invalid String", -1);
}
于 2012-04-04T13:18:36.857 回答