ここで、正規表現の範囲を超えた課題があります。誰かに提案があれば、それは大歓迎です。このようなものを追跡することはできませんでした。実行可能かどうかはわかりません。私はJavaで次の式を使用しています:
"(?i)-?(([1-9]+[0-9]*)|0)(\\.[0-9]*[1-9]+)?(e-?[0-9]+)?"
長い文字列 (最大 255 文字) を検証して、許可された数値 (計算の種類に関係なく) に少なくとも収まることを確認し、科学的表記法のオプションを許可します。BigDecimal クラスは私が必要とするすべてを行っていなかったので、値は数値の最も単純化された表現に適合し、変更なしで予測可能なプロトコルに従う必要があるため、小数部分の先行ゼロと後続ゼロの追加チェックがあります。以下はすべて、私が期待する結果を返しています。
String allowance = "(?i)-?(([1-9]+[0-9]*)|0)(\\.[0-9]*[1-9]+)?(e-?[0-9]+)?" ;
System.out.println("0".matches(allowance)) ; // assert true. Confirm default
System.out.println("-42".matches(allowance)) ; // assert true. Confirm integers only
System.out.println("0.2e543".matches(allowance)) ; // assert true
System.out.println("1e543".matches(allowance)) ; // assert true
System.out.println("0.2000e543".matches(allowance)) ; // assert false : trailing zeros after fractional .2
System.out.println(".2e543".matches(allowance)) ; // assert false : missing the leading zero
System.out.println("e543".matches(allowance)) ; // assert false : malformed
System.out.println("0001e543".matches(allowance)) ; // assert false : leading zeros in the integer
System.out.println("1.0".matches(allowance)) ; // assert false : easiest match is "1"
System.out.println("0.0".matches(allowance)) ; // assert false : easiest match is "0"
それはそれでいいのですが、この 2 つを同じ表現で理解することはできません。どちらか一方かもしれませんが、両方ではありません:
System.out.println("-0".matches(allowance)) ; // Supposed to be FALSE - Should just be "0"
System.out.println("0e543".matches(allowance)) ; // Supposed to be FALSE - "0" integer rules out the exponent segment so the easiest match would be "0"
セグメント "-?(([1-9]+[0-9] )|0)(\.[0-9] [1-9]+)?"をトラップすることは可能ですか? 2 つの別々の重複するテストとして: 1) "-0" を除外しますが、値に小数値がない場合のみ (つまり、-0.5 が許容されます)、次にジャンプして 2) 次の後続を除外します " e543" 整数値がテストで "0" として返される場合の指数?