Разобрать строку, содержащую javascript - PullRequest
0 голосов
/ 09 марта 2020

У меня есть строка:

2 + 2 = ${2 + 2}
This is a ${"string"}
This is an object: ${JSON.stringify({a: "B"})}
This should be "<something>": ${{
    abc: "def",
    cba: {
        arr: [
            "<something>"
        ]
    }

}.cba.arr[0]}
This should ${"${also work}"}

И после анализа я должен получить что-то вроде этого:

2 + 2 = 4
This is a string
This is an object: {"a":"B"}
This should be "<something>": <something>
This should ${also work}

Поэтому мне нужна помощь в реализации в Java , мне просто нужно получить то, что находится между ${ и }.

Я пытался использовать регулярное выражение: \${(.+?)}, но оно завершается неудачно, когда строка внутри содержит }

1 Ответ

0 голосов
/ 09 марта 2020

Итак, после небольшого тестирования я получил следующее:

ScriptEngine scriptEngine = new ScriptEngineManager(null).getEngineByName("JavaScript");
String str = "2 + 2 = ${2 + 2}\n" +
        "This is a ${\"string\"}\n" +
        "This is an object: ${JSON.stringify({a: \"B\"})}\n" +
        "This should be \"F\": ${var test = {\n" +
        "    a : {\n" +
        "        c : \"F\"\n" +
        "    }\n" +
        "};\n" +
        "test.a.c\n" +
        "}\n" +
        "This should ${\"${also work}\"}"; // String to be parsed
StringBuffer result = new StringBuffer();
boolean dollarSign = false;
int bracketsOpen = 0;
int beginIndex = -1;
int lastEndIndex = 0;
char[] chars = str.toCharArray();
for(int i = 0; i < chars.length; i++) { // i is for index
    char c = chars[i];
    if(dollarSign) {
        if(c == '{') {
            if(beginIndex == -1) {
                beginIndex = i + 1;
            }
            bracketsOpen++;
        } else if(c == '}') {
            if(bracketsOpen > 0) {
                bracketsOpen--;
            }
            if(bracketsOpen <= 0) {
                int endIndex = i;
                String evalResult = ""; // evalResult is the replacement value
                try {
                    evalResult = scriptEngine.eval(str.substring(beginIndex, endIndex)).toString(); // Using script engine as an example; str.substring(beginIndex, endIndex) is used to get string between ${ and }
                } catch (ScriptException e) {
                    e.printStackTrace();
                }
                result.append(str.substring(lastEndIndex, beginIndex - 2));
                result.append(evalResult);
                lastEndIndex = endIndex + 1;
                dollarSign = false;
                beginIndex = -1;
                bracketsOpen = 0;
            }
        } else {
            dollarSign = false;
        }
    } else {
        if(c == '$') {
            dollarSign = true;
        }
    }
}
result.append(str.substring(lastEndIndex));
System.out.println(result.toString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...