我正在尝试解析一个表示要在递归下降解析器中使用的语法的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的'”
“”
“|”
当我真正想要的时候应该是这样的:
任何人都有任何想法,我做错了什么?
答案 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("\\|");
告诉它查找实际的管道字符。