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());
}

例外はスローされませんが、なぜですか?最初に、「例外」式に論理的な問題があると思ったので、次のパターンでこの値を試しました。

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)

1つ以上の数字、コンマ、およびドットで構成される任意の文字列に一致します。

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

あなたはあなたの表現を適切に否定していません。

最初の例では、「入力が数字、コンマ、ドットのみに一致する場合」と言うと、問題ありません。

2番目の例(そして、それがあなたの意図したことを実行するかどうかはわかりませんが、それは別の話です)では、「入力が数字、コンマ、ドット以外の文字のみに一致する場合」と言うつもりでしたが、入力には次のものが含まれています数字なので、一致は機能しません。

最後の例では、同じことですが、「入力が数字以外の文字とのみ一致する場合」と言っていますが、ここでも入力に数字が含まれています

于 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 に答える