package bjc.utils.funcutils; import java.util.regex.Pattern; /* * Checks if a string would pass Double.parseDouble. * * Uses a regex from the javadoc for Double.valueOf() */ class DoubleMatcher { private static final String Digits = "(\\p{Digit}+)"; private static final String HexDigits = "(\\p{XDigit}+)"; /* * an exponent is 'e' or 'E' followed by an optionally signed decimal * integer. */ private static final String Exp = "[eE][+-]?" + Digits; private static final String fpRegex = "[\\x00-\\x20]*" + // Optional // leading // "whitespace" "[+-]?(" + // Optional sign character "NaN|" + // "NaN" string "Infinity|" + // "Infinity" string /* * A decimal floating-point string representing a finite * positive number without a leading sign has at most * five basic pieces: Digits . Digits ExponentPart * FloatTypeSuffix * * Since this method allows integer-only strings as * input in addition to strings of floating-point * literals, the two sub-patterns below are * simplifications of the grammar productions from * section 3.10.2 of The Java™ Language Specification. */ /* * Digits ._opt Digits_opt ExponentPart_opt * FloatTypeSuffix_opt */ "(((" + Digits + "(\\.)?(" + Digits + "?)(" + Exp + ")?)|" + /* * . Digits ExponentPart_opt FloatTypeSuffix_opt */ "(\\.(" + Digits + ")(" + Exp + ")?)|" + /* * Hexadecimal strings */ "((" + /* * 0[xX] HexDigits ._opt BinaryExponent * FloatTypeSuffix_opt */ "(0[xX]" + HexDigits + "(\\.)?)|" + /* * 0[xX] HexDigits_opt . HexDigits BinaryExponent * FloatTypeSuffix_opt */ "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" + ")[pP][+-]?" + Digits + "))" + "[fFdD]?))" + "[\\x00-\\x20]*"; // Optional // trailing // "whitespace" public static final Pattern floatingLiteral = Pattern.compile("\\A" + fpRegex + "\\Z"); }