package foundation.variant.expression; public class VariantParser { private static char DefaultFlag_Variant = '@'; private static char DefaultFlag_LeftQuote = '{'; private static char DefaultFlag_RightQuote = '}'; private char Flag_Variant; private char Flag_LeftQuote; private char Flag_RightQuote; private IVariantParseListener listener; public VariantParser(IVariantParseListener listener) { this.listener = listener; this.Flag_Variant = DefaultFlag_Variant; this.Flag_LeftQuote = DefaultFlag_LeftQuote; this.Flag_RightQuote = DefaultFlag_RightQuote; } public void parse(String expression) throws Exception { if (expression == null) { return; } int length = expression.length(); String segmentString; int variantLength = 0; int begin = 0; char curr; for (int i = 0; i < length; i++) { curr = expression.charAt(i); if (isKey(curr)) { if (Flag_LeftQuote != expression.charAt(Math.min(i + 1, length - 1))) { continue; } segmentString = expression.substring(begin, i); onFindSegment(segmentString); variantLength = getVariantLength(expression, i + 1, length); segmentString = expression.substring(i + 2, i + 2 + variantLength); onFindVariant(curr, segmentString); i = i + 2 + variantLength; begin = i + 1; } } if (begin <= length - 1) { segmentString = expression.substring(begin, length); onFindSegment(segmentString); } } public static String getVariantName(String value) { if (value == null) { return null; } int begin = value.indexOf("@{") + 2; int end = value.indexOf("}", begin); if (end <= begin) { return null; } return value.substring(begin, end); } public static String toSegmentString(String name) { return "@{" + name + "}"; } protected boolean isKey(char value) { return Flag_Variant == value; } protected void onFindSegment(String segment) throws Exception { if (listener != null) { listener.onSegment(segment); } } protected void onFindVariant(char key, String variant) throws Exception { if (listener != null) { listener.addVariant(variant); } } private int getVariantLength(String expression, int pos, int max) throws Exception { if (Flag_LeftQuote == expression.charAt(pos)) { for (int i = pos + 1; i < max; i++) { if (Flag_RightQuote == expression.charAt(i)) { return i - pos - 1; } } } else { throw new Exception("error parse param expression (" + pos + "):" + expression); } throw new Exception("error parse param expression (" + pos + "):" + expression); } public void setFlag_Variant(char value) { Flag_Variant = value; } public void setFlag_LeftQuote(char value) { Flag_LeftQuote = value; } public void setFlag_RightQuote(char value) { Flag_RightQuote = value; } public static void main(String[] args) { System.out.println(getVariantName("123@{456}789")); } }