gpt4 book ai didi

java - RegExpr 与否定字符类混淆?

转载 作者:行者123 更新时间:2023-12-02 07:52:50 24 4
gpt4 key购买 nike

我有以下方法:

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”,那么为什么不匹配呢?

最佳答案

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

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 或更多”。它没有做你认为它正在做的事情。

关于java - RegExpr 与否定字符类混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10011597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com