0

我用 Java 编写了一个括号检查器,在文本中搜索单引号时遇到问题。如果我有一个像下面这样的字符串(!在这种情况下,我感兴趣的是文本而不是代码):

else if (line.charAt(i)=='\''||line.charAt(i)=='\"'){

在调试器中,我看到在第一个等号之后,我的字符串中出现了以下字符:

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));
    }
}

它失败了,因为在上面显示的行中它读取了三个单引号/双引号。它应该只读取其中两个。我不明白如何避免扫描仪将上面显示的语句中的第二个单/双引号读取为单引号。我认为这是用反斜杠完成的。

4

1 回答 1

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块已经确保行字符是'",所以我们可以继续直接将它与字符堆栈的头部进行比较。

于 2013-06-01T18:36:32.427 回答