Знаки кавычек в строках (java)

Я пишу проверку скобок на Java и у меня проблемы с поиском одинарных кавычек в тексте. если у меня есть строка, например, например. следующее (! в данном случае меня интересует текст, а не код):

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

в отладчике я вижу, что после первого знака равенства я получаю следующие символы в своей строке:

0 = '

1 = \\\

2 = ' 

3 = '

Как совместить 1 и 2 - чтобы он больше не читал второе 'как'? Я думал, что это делается с помощью обратной косой черты, но, очевидно, я делаю что-то не так.

Если код чем-то полезен: вот как я обрабатываю одинарные и двойные кавычки:

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

Это не удается, потому что в строке, показанной выше, он читает три одинарных/двойных кавычки. Он должен прочитать только два из них. Я не понимаю, как я могу избежать того, чтобы сканер считывал вторую одинарную/двойную кавычку в операторе, показанном выше, как одинарную кавычку. Я думал, что это делается с помощью обратной косой черты.


person Rattlesnake    schedule 01.06.2013    source источник
comment
Как мы должны знать, что вы делаете неправильно, не видя вашего кода?   -  person jlordo    schedule 01.06.2013


Ответы (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 уже удостоверился, что линейный символ равен ' или ", и поэтому мы можем продолжить и напрямую сравнить его с головой вашего стека символов.

person Ravi K Thapliyal    schedule 01.06.2013