java
  • string
  • quote
  • 2013-06-01 51 views -1 likes 
    -1

    我在Java中編寫了一個括號檢查器,並且在文本中搜索單引號時遇到問題。 如果我有一個像例如下面(!在這種情況下,這是我很感興趣的文本而不是代碼):在調試器中我看到引用字符串中的符號(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)); 
        } 
    } 
    

    它失敗,因爲它上面顯示的行讀取三個單/雙引號。它應該只讀取其中的兩個。我不明白我如何才能避免Scanner在上面顯示的語句中以單引號的形式閱讀第二個單/雙引號。我認爲這是用反斜槓完成的。

    +3

    我們應該如何知道自己在做錯了什麼而沒有看到自己的代碼? – jlordo

    回答

    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塊已經確信該行字符是'",所以我們可以繼續,並直接將其與頭部比較你字符堆棧。

    相關問題