文字列パターンマッチングのためにC++コードでTcl_StringCaseMatch
関数を使用しています。入力パターンや文字列に括弧がつくまではすべてうまく動作します。[]
たとえば、のように:Tcl_StringCaseMatchでエスケープする角括弧
str1 = pq[0] pattern = pq[*]
Tcl_StringCaseMatch
すなわち、上記の入力に対してfalseを返す機能していません。 パターンマッチングで[]
を回避する方法はありますか?
文字列パターンマッチングのためにC++コードでTcl_StringCaseMatch
関数を使用しています。入力パターンや文字列に括弧がつくまではすべてうまく動作します。[]
たとえば、のように:Tcl_StringCaseMatchでエスケープする角括弧
str1 = pq[0] pattern = pq[*]
Tcl_StringCaseMatch
すなわち、上記の入力に対してfalseを返す機能していません。 パターンマッチングで[]
を回避する方法はありますか?
問題は[]
はパターンマッチングの特殊文字です。
pattern= "pq\\[*\\]"
これは文字列にも影響するとは思わないが、私はそれらを平文文字のように扱うためにバックスラッシュでエスケープする必要がある。二重スラッシュの理由は、バックスラッシュ自体をTCLエンジンに渡したいからです。カジュアルな読者のために
: - ( ``またはシェルで$()
のような)「runコマンド」が、[number]
があります
[]
は、一般的にはTCLで特別な意味を持っているが、パターンマッチング役割を超えて、彼らはここに取ります括弧は正常に処理されます。したがって、文字列str1
はここでエスケープする必要はありません。余計な混乱のために
:
TCLにはデフォルトで通常の文字として[
直前で]
を解釈します。私はそれがあまりにも混乱していると感じ、むしろTCLが不均衡な括弧で苦情を言います。しかし、OPに言及すると、最後の2つのバックスラッシュを省き、"pq\\[*]"
を使用することができます。私はこれを嫌い、むしろ両方とも通常のTCLのやり方ではなく、各自の/自分のものであることを明らかにします。
ブラケットを外したり、開けたりする必要がありますか? –
@AvinashKumar TCLが接頭辞 '['を付けずに ']'を見ると、それは通常の文字であるとみなされ、そのため動作します。私はむしろエラーが投げられるよりはるかに多いだろう。私はそれが混乱していると思うので、私は解決にそれを加えなかったが、あなたが言うように - それは動作する。 – kabanus
@AvinashKumarコメントをインラインで変更しました。前の方が良かったです。最初のものをエスケープするだけでしたが、私の編集を見てください。 – kabanus