Подтвердить что ты не робот

Разделение строки Java не возвращает правильные значения

Я пытаюсь разобрать txt файл, который представляет грамматику, которая будет использоваться в парсере рекурсивного спуска. Файл txt будет выглядеть примерно так:

SPRIME:: = Expr eof
Expr:: = Term Expr '
Expr ':: = + Term Expr' | - Term Expr '| e

Чтобы изолировать левую сторону и разделить правую сторону на отдельные правила производства, я беру каждую строку и вызываю:

String[] firstSplit = line.split("::=");
String LHS = firstSplit[0];
String productionRules = firstSplit[1].split("|");

Однако, когда я вызываю второй метод split, я не возвращаю массив строк, разделенных символом "|" характер, но массив каждого индивидуалистического персонажа с правой стороны, включая "|". Например, если бы я разбирал правило Expr и печатал массив productionRules, это выглядело бы так:

"+"
"Термин"
"Выраж '"
""
"|"

Когда то, что я действительно хочу, должно выглядеть так:

  • Term Expr '

У кого-нибудь есть идеи, что я делаю неправильно?

4b9b3361

Ответ 1

Так как split принимает регулярное выражение как аргумент, вы должны избегать всех непринятых символов регулярных выражений.

Ответ 2

Параметр String.split() является регулярным выражением, а символ вертикальной полосы является особым.

Попробуйте выполнить обратную косую черту:

String productionRules = firstSplit[1].split("\\|");

NB: требуются две обратные слэши, так как сам символ обратной косой черты является особым в строковых литералах.

Ответ 3

Вам нужно избежать символа трубы (|), который является оператором regex OR.

String productionRules = firstSplit[1].split("\\|");

или

String productionRules = firstSplit[1].split(Pattern.quote("|"));

Ответ 4

Характер трубы - это оператор регулярных выражений для "или". Вы хотите

String productionRules = firstSplit[1].split("\\|");

который сообщает ему, что он ищет фактический символ канала.