0

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

上記の行で 3 つの一重引用符または二重引用符を読み取るため、失敗します。そのうちの 2 つだけを読み取る必要があります。スキャナーが上記のステートメントの 2 番目の一重/二重引用符を一重引用符として読み取らないようにする方法がわかりません。バックスラッシュで行われていると思いました。

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 に答える