Ответ 1
Так как split
принимает регулярное выражение как аргумент, вы должны избегать всех непринятых символов регулярных выражений.
Я пытаюсь разобрать 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, это выглядело бы так:
"+"
"Термин"
"Выраж '"
""
"|"
Когда то, что я действительно хочу, должно выглядеть так:
У кого-нибудь есть идеи, что я делаю неправильно?
Так как split
принимает регулярное выражение как аргумент, вы должны избегать всех непринятых символов регулярных выражений.
Параметр String.split()
является регулярным выражением, а символ вертикальной полосы является особым.
Попробуйте выполнить обратную косую черту:
String productionRules = firstSplit[1].split("\\|");
NB: требуются две обратные слэши, так как сам символ обратной косой черты является особым в строковых литералах.
Вам нужно избежать символа трубы (|
), который является оператором regex
OR
.
String productionRules = firstSplit[1].split("\\|");
или
String productionRules = firstSplit[1].split(Pattern.quote("|"));
Характер трубы - это оператор регулярных выражений для "или". Вы хотите
String productionRules = firstSplit[1].split("\\|");
который сообщает ему, что он ищет фактический символ канала.