Java字符串分割未返回正确的值

29
我正在尝试解析一个文本文件,该文件表示用于递归下降解析器中使用的语法。 文本文件的格式类似于:

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数组,它将如下所示:
"+"
"Term"
"Expr'"
""
"|"
而我真正想要的应该是这样的:
Term Expr'
有人知道我做错了什么吗?
4个回答

72
String.split() 方法的参数是一个正则表达式,而竖线字符是特殊的。 尝试使用反斜杠进行转义:
String productionRules = firstSplit[1].split("\\|");

注意:由于反斜杠字符在字符串文字中本身就是特殊字符,因此需要使用两个反斜杠。


使用Java编程语言,将字符串"firstSplit[1].split("[|]")"进行拆分。 - undefined

26

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


14
你需要转义管道符号(|),它是一个正则表达式的OR运算符。

你需要转义管道符号(|),它是一个正则表达式的OR运算符。

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

7
管道符号是正则表达式中的“或”运算符。你所需要的是:
String productionRules = firstSplit[1].split("\\|");

这告诉它要寻找实际的管道字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接