我用Java编写了一个括号检查器,并且在文本中搜索单引号时遇到问题。 如果我有一个字符串,例如以下(!在这种情况下,它是我感兴趣的文本而不是代码):
else if (line.charAt(i)=='\''||line.charAt(i)=='\"'){
在调试器中我看到在第一个等号后面我在String中得到以下字符:
0 = '
1 = \\\
2 = '
3 = '
如何将1和2组合在一起 - 这样他就不再读第二个'as'了?我认为这是用反斜杠完成的 - 但显然我做错了。
如果代码有任何帮助:这就是我对单引号和双引号的处理方式:
Stack <Character> theStack = new Stack<Character>();
// loop through file line per line
String line;
else if (line.charAt(i)=='\'' ||line.charAt(i)=='\"'){
// check whether there is already one of them on top
if (line.charAt(i)== '\'' && theStack.peek()=='\''){
theStack.pop();
}
else if (line.charAt(i)== '\"' && theStack.peek()=='\"'){
theStack.pop();
}
// else push new one on top
else {
theStack.push(line.charAt(i));
}
}
它失败了,因为在上面显示的行中它读取三个单/双引号。它应该只读取其中两个。我不明白如何避免扫描仪在上面显示的语句中读取第二个单/双引号作为单引号。我认为这是用反斜杠完成的。
答案 0 :(得分:1)
只需修改if
条件,如下所示
else if ((line.charAt(i) == '\'' || line.charAt(i) == '\"')
&& line.charAt(i-1) != '\\') {
这会忽略所有使用反斜杠转义的引号,即不应将其视为结束引号并弹出您的字符堆栈。您可以进一步简化if-else
块
// check whether there is already one of them on top
if (line.charAt(i) == theStack.peek()) { // un-boxing to char
theStack.pop();
}
// else push new one on top
else {
theStack.push(line.charAt(i));
}
这是有效的,因为父else-if
块已确定行字符为'
或"
,因此我们可以直接将其与您的头部进行比较字符堆栈。