Java String split не возвращает правильные значения - PullRequest
20 голосов
/ 15 апреля 2011

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

SPRIME :: = Expr eof
Expr :: = Term Expr '
Expr' :: = + Term Expr '|- Срок Экспр '|e

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

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

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

"+"
"Term"
"Expr '"
""
" | "

Когда то, что я действительно хочу, должно выглядеть следующим образом:

  • Term Expr '

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

Ответы [ 4 ]

52 голосов
/ 15 апреля 2011

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

Попробуйте экранировать его с обратной косой чертой:

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

Примечание: требуются две обратные косые черты, поскольку сам символ обратной косой черты является специальным в строковых литералах.

22 голосов
/ 15 апреля 2011

Поскольку split принимает в качестве аргумента регулярное выражение, вы должны экранировать все непреднамеренные символы регулярного выражения.

11 голосов
/ 15 апреля 2011

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

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

или

String productionRules = firstSplit[1].split(Pattern.quote("|"));
7 голосов
/ 15 апреля 2011

Символ канала является оператором регулярного выражения для «или».То, что вы хотите, это

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

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

...