Java String拆分不返回正确的值

时间:2011-04-15 11:00:35

标签: java parsing string

我正在尝试解析一个表示要在递归下降解析器中使用的语法的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数组,它将如下所示:

“+”
“期限”
“Expr的'”
“”
“|”

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

  • Term Expr'

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

4 个答案:

答案 0 :(得分:52)

String.split()的参数是正则表达式,垂直条字符是特殊的。

尝试使用反斜杠转义它:

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

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

答案 1 :(得分:22)

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

答案 2 :(得分:11)

您需要转义管道(|)符号,该符号是regex OR运算符。

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

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

答案 3 :(得分:7)

管道字符是“或”的正则表达式运算符。你想要的是

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

告诉它查找实际的管道字符。