Java String拆分不返回正确的值

Ric*_*kes 20 java string parsing

我正在尝试解析一个表示要在递归下降解析器中使用的语法的txt文件.txt文件看起来像这样:

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

为了隔离左侧并将右侧分成单独的生产规则,我采取每一行并致电:

String[] firstSplit = line.split("::=");
String LHS = firstSplit[0];
String productionRules = firstSplit[1].split("|");
Run Code Online (Sandbox Code Playgroud)

但是,当我调用第二个split方法时,我没有返回由"|"分隔的字符串数组 字符,但右侧是每个独立字符的数组,包括"|".例如,如果我正在解析Expr'规则并打印了productionRules数组,它将如下所示:

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

当我真正想要的应该是这样的:

  • 期限Expr'

任何人都有任何想法,我做错了什么?

Aln*_*tak 53

参数to String.split()正则表达式,竖线字符是特殊的.

尝试使用反斜杠转义它:

String productionRules = firstSplit[1].split("\\|");
Run Code Online (Sandbox Code Playgroud)

注意:需要两个反斜杠,因为反斜杠字符本身在字符串文字中是特殊的.


dcn*_*dcn 22

由于split将正则表达式作为参数,您必须转义所有非预期的正则表达式符号.


Pri*_*ley 11

您需要转义|作为regex OR运算符的pipe()符号.

String productionRules = firstSplit[1].split("\\|");
Run Code Online (Sandbox Code Playgroud)

要么

String productionRules = firstSplit[1].split(Pattern.quote("|"));
Run Code Online (Sandbox Code Playgroud)


Jon*_*ght 7

管道字符是"或"的正则表达式运算符.你想要的是什么

String productionRules = firstSplit[1].split("\\|");
Run Code Online (Sandbox Code Playgroud)

它告诉它寻找一个实际的管道角色.