引用字符串中的符号(java)

时间:2013-06-01 18:02:46

标签: java string quote

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

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

1 个答案:

答案 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块已确定行字符为'",因此我们可以直接将其与您的头部进行比较字符堆栈。