From 740c5a4c13e98bd04b385eee9b881e53eb88d3b8 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Mon, 26 Aug 2019 16:52:11 -0400 Subject: The unit file parser now uses regular expressions. --- src/org/unitConverter/UnitsDatabase.java | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) mode change 100755 => 100644 src/org/unitConverter/UnitsDatabase.java (limited to 'src/org/unitConverter/UnitsDatabase.java') diff --git a/src/org/unitConverter/UnitsDatabase.java b/src/org/unitConverter/UnitsDatabase.java old mode 100755 new mode 100644 index 37d53d4..dcc98df --- a/src/org/unitConverter/UnitsDatabase.java +++ b/src/org/unitConverter/UnitsDatabase.java @@ -36,6 +36,8 @@ import java.util.Set; import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.unitConverter.dimension.UnitDimension; import org.unitConverter.math.DecimalComparison; @@ -971,6 +973,11 @@ public final class UnitsDatabase { } } + /** + * A regular expression that separates names and expressions in unit files. + */ + private static final Pattern NAME_EXPRESSION = Pattern.compile("(\\S+)\\s+(\\S.*)"); + /** * The exponent operator * @@ -1200,13 +1207,22 @@ public final class UnitsDatabase { } // divide line into name and expression - final String[] parts = line.split("\t"); - if (parts.length < 2) + final Matcher lineMatcher = NAME_EXPRESSION.matcher(line); + if (!lineMatcher.matches()) throw new IllegalArgumentException(String.format( - "Lines must consist of a unit name and its definition, separated by tab(s) (line %d).", + "Error at line %d: Lines of a unit file must consist of a unit name, then spaces or tabs, then a unit expression.", lineCounter)); - final String name = parts[0]; - final String expression = parts[parts.length - 1]; + final String name = lineMatcher.group(1); + final String expression = lineMatcher.group(2); + + // divide line into name and expression + // final String[] parts = line.split("\t"); + // if (parts.length < 2) + // throw new IllegalArgumentException(String.format( + // "Lines must consist of a unit name and its definition, separated by tab(s) (line %d).", + // lineCounter)); + // final String name = parts[0]; + // final String expression = parts[parts.length - 1]; if (name.endsWith(" ")) { System.err.printf("Warning - line %d's unit name ends in a space", lineCounter); -- cgit v1.2.3