4

Scanner オブジェクトを使用してテキストをスキャンしていますlineScanner。宣言は次のとおりです。

String myText= "200,00/100,00/28/65.36/21/458,696/25.125/4.23/6.3/4,2/659845/4524/456,65/45/23.495.254,3";
Scanner lineScanner = new Scanner(myText);

それでScanner、最初の を見つけたいと思いますBigDecimalBIG_DECIMAL_PATTERN任意のケースに一致するa を宣言しました。

私が定義したルールは次のとおりです。

  • 千の区切り記号の後には常に正確に 3 桁の数字が続きます
  • 小数点以下は常に正確に 1 桁または 2 桁です。
  • 桁区切り記号がコンマ記号の場合、小数点はドット記号になり、逆に
  • 数値の小数部分として、3 桁区切り記号はオプションです

String nextBigDecimal = lineScanner.findInLine(BIG_DECIMAL_PATTERN);

さて、ここにBIG_DECIMAL_PATTERN私が宣言したものがあります:

private final String BIG_DECIMAL_PATTERN=
      "\\d+(\\054\\d{3}+)?(\\056\\d{1,2}+)?|\\d+(\\056\\d{3}+)?(\\054\\d{1,2}+)?)";

\\054の ASCII 8 進数表現です。","

\\056の ASCII 8 進数表現です。"."

私の問題は、最初の部分のパターンが見つかったときに、2 番目の部分 ( の後|) がチェックされず、私の例では最初の一致が200and ではないため、うまく機能しないこと200,00です。だから私はこれを試すことができます:

private final String BIG_DECIMAL_PATTERN=\\d+([.,]\\d{3}+)?([,.]\\d{1,2}+)? 

しかし、新しい問題があります。コンマとドットは排他的ではありません。つまり、一方が千単位の区切り記号である場合、小数点はもう一方でなければならないということです。

助けてくれてありがとう。

4

2 に答える 2

1

どちらかまたは正規表現を実行できますか? 例:

private final String BIG_DECIMAL_PATTERN
    = "\\d+((\\.\\d{3}+)?(,\\d{1,2}+)?|(,\\d{3}+)?(\\.\\d{1,2}+)?)"

注 - あなたの正規表現が実際に機能するかどうかは確認していません。これは、あなたがやろうとしていることを達成するための最良の方法ではないかもしれません. 私がここで行っているのは、あなたを立ち上げて実行するために、(regex1|regex2)どこでregex1is ドットの後にカンマが続くか、regex2is カンマの後にドットが続くかを試してみることを提案することだけです。

于 2013-04-23T13:30:28.943 に答える