From a63c30f5fe9ee302e73bb30e35095d789adb1a80 Mon Sep 17 00:00:00 2001 From: bjculkin Date: Fri, 17 Mar 2017 08:33:37 -0400 Subject: Refactor StringUtils Moved a bunch of token-oriented stuff from StringUtils to a new TokenUtils class. --- .../java/bjc/utils/parserutils/DoubleMatcher.java | 71 ++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 BJC-Utils2/src/main/java/bjc/utils/parserutils/DoubleMatcher.java (limited to 'BJC-Utils2/src/main/java/bjc/utils/parserutils/DoubleMatcher.java') diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/DoubleMatcher.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/DoubleMatcher.java new file mode 100644 index 0000000..63eabca --- /dev/null +++ b/BJC-Utils2/src/main/java/bjc/utils/parserutils/DoubleMatcher.java @@ -0,0 +1,71 @@ +package bjc.utils.parserutils; + +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"); +} -- cgit v1.2.3