如何按特定的配对组拆分字符串?

时间:2019-01-16 22:09:24

标签: java string split

我正在用Java编写自己的JSON解析器,并且正在寻找一种用逗号或冒号分隔字符串的方法,这些字符串位于[]{}""之外对。

我找到了tutorial via Google,并且可以使用。问题是,它还捕获了这些括号内的逗号,我需要省略它们。我不知道如何编辑正则表达式以从这些括号对之一中排除捕获的逗号。我尝试了类似",(?=([^\"\\{\\[]*\"[^\"\\}\\]]*\")*[^\"]*$)"的方法,但是没有用。它使事情更加混乱。冒号分隔也是如此,用于分隔JSON对象的键和值。

有没有一种方法可以将""{}[]对在正则表达式中组合在一起以使其起作用?抱歉,如果我看起来很a脚,但我真的不知道正则表达式的样子。

顺便说一句,这是一个代码片段,我想在以下位置使用它:

public class JavaJSON {
    private HashMap<String, Object> content;

    // Constructors

    /**
     * Create new empty JSON object
     */
    public JavaJSON() {
        this.content = new HashMap<>();
    }
    // ...

    /**
     * Parse a JSON string to a JSON object
     *
     * @param JSON JSON string to be converted to JSON object
     * @return JSON object from given string
     */
    public static JavaJSON parse(@NotNull String JSON) {
        if (!JSON.startsWith("{") || !JSON.endsWith("}")) return null;
        // If this is not a valid JSON string, return nothing.

        JavaJSON output = new JavaJSON();

        String content = JSON.substring(1, JSON.length() - 1);
        if (content.length() == 0) return output;    // if empty, return an empty JSON object

        // Regex literals
        String commaSeparated = ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)";  // TODO: Change commaSeparated to capture any {} [] "" pair group
        String colonSeparated = ":(?=([^\"]*\"[^\"]*\")*[^\"]*$)";  // TODO: Change colonSeparated to capture any {} [] "" pair group

        String[] tokens = content.split(commaSeparated);

        if (tokens.length == 0) return null;
        // Don't know exactly if this is going to happen, but better be sure

        for (String token : tokens) {
            String rawToken = token.trim();

            if (rawToken.length() == 0) return null;
            // Omitted comma, extra comma, etc. = JSON error

            String[] mapToken = rawToken.split(colonSeparated);
            if (mapToken.length < 2 || mapToken.length > 2) return null;
            // Expected format = {"foo": "bar"}; format isn't valid

            String mapKey = mapToken[0].trim();
            String mapValue = mapToken[1].trim();

            if (!mapKey.startsWith("\"") || !mapKey.endsWith("\"")) return null;
            // Key must be a string

            String rawMapKey = mapKey.substring(1, mapKey.length() - 1);    // get quote-less variant
            if (rawMapKey.length() == 0) return null;
            // Key must not be empty

            // check errors
            if (mapValue.startsWith("{") && !mapValue.endsWith("}")) return null;
            // Not a valid JSON object
            if (mapValue.startsWith("[") && !mapValue.endsWith("]")) return null;
            // Not a valid JSON array
            if (mapValue.startsWith("\"") && !mapValue.endsWith("\"")) return null;
            // Not a valid string

            // get value object
            Object rawMapValue;

            // parse value object
            if (mapValue.startsWith("\"") && mapValue.endsWith("\"")) {
                rawMapValue = mapValue.substring(1, mapValue.length() - 1);
            } else if (mapValue.startsWith("{") && mapValue.endsWith("}")) {
                rawMapValue = parse(mapValue);
            } else if (mapValue.startsWith("[") && mapValue.endsWith("]")) {
                rawMapValue = parseArray(mapValue);
            } else {
                try {
                    rawMapValue = Long.parseLong(mapValue);
                } catch (Exception e) {
                    try {
                        rawMapValue = Double.parseDouble(mapValue);
                    } catch (Exception f) {
                        return null;
                        // Not a valid number
                    }
                }
            }

            output.update(rawMapKey, rawMapValue);
        }

        return output;
    }

    // ...
}

0 个答案:

没有答案