Как разделить строку специальным символом и игнорировать все, что находится в скобках? - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу разделить строку на "/" и игнорировать "/" во внешних скобках.

Пример входной строки:

"Apple 001/(Orange (002/003) ABC)/Mango 003 )/( ASDJ/(Watermelon )004)/Apple 002 ASND/(Mango)"

Ожидаемый вывод в массиве строк:

["Apple 001", "(Orange (002/003) ABC)", "Mango 003 )/( ASDJ", "(Watermelon )004)", "Apple 002 ASND", "(Mango)"]

Это мое регулярное выражение:

\/(?=(?:[^\(\)]*\([^\(\)]*\))*[^\(\)]*$)

Но он может поддерживать только простую строку, подобную этой:

"Apple 001/(Orange 002/003 ABC)/Mango 003 ASDJ/(Watermelon 004)/Apple 002 ASND/(Mango)"

Если есть внутренние скобки, результат неверен.

1 Ответ

0 голосов
/ 11 февраля 2019

Вот пример парсера, который реализует ваши потребности:

public static List<String> splitter(String input) {
    int nestingLevel=0;
    StringBuilder currentToken=new StringBuilder();
    List<String> result = new ArrayList<>();
    for (char c: input.toCharArray()) {
        if (nestingLevel==0 && c == '/') { // the character is a separator !
            result.add(currentToken.toString());
            currentToken=new StringBuilder();
        } else {
            if (c == '(') { nestingLevel++; }
            else if (c == ')' && nestingLevel > 0) { nestingLevel--; }

            currentToken.append(c);
        }
    }
    result.add(currentToken.toString());
    return result;
}

Вы можете попробовать его здесь .

Обратите внимание, что это не приводит кожидаемый результат, который вы опубликовали, но я не уверен, какой алгоритм вы использовали, чтобы получить такой результат.В частности, я убедился, что нет «отрицательного уровня вложенности», поэтому для начала / в "Mango 003 )/( ASDJ" рассматривается вне скобок и анализируется как разделитель.

В любом случае, я уверен, что выЯ могу изменить мой ответ гораздо проще, чем вы, например, в виде регулярных выражений, и весь смысл моего ответа состоит в том, чтобы показать, что написание синтаксического анализатора для решения таких проблем зачастую более реалистично, чем попытка создать регулярное выражение.

...