2012-02-07 54 views
3

私は、tclを使用してSOAPメッセージから特定のフォルトコードを解析するスクリプトを作成しています。最後に、メッセージを希望のメッセージと比較する部分に来ました。あなたが見ることができるように、私は私が、私が提供した例では、文字列「9000」の配列要素に含まれている「$石鹸(障害)」文字列一致を使用する場合、特殊文字をエスケープする必要がありますか?


if { [ string match *\<FaultCode\>9000\</FaultCode\>* $soap(Fault) ] } { 

    # -- Success case 

} else { 

    # -- fail case 

} 

かどうかを確認しようとしています

&;`'"|*?~<>^()[]{}$\ 

のすべての「特殊文字」をエスケープしましたか?一つは、単に行うことができます:

*<FaultCode>9000</FaultCode>* ? 

私はかなり徹底的に周りを見回していると、私が求めていたものと全く同じくらい正確な何かを見つけることができませんでした。私はtclチャットルームで尋ねるつもりだったが、見つけられなかった!

おかげ

+0

Tclのチャットがあります:http://www.tcl.tk/community/ –

答えて

4

短い答えはノー、あなたがすべてこれらの文字をエスケープする必要がないことです。実際に、それらの文字のいくつかは特別ではありません。

二つの層がここにあります:最初、Tclの構文解析レベルで:tcl's parsing rulesを通読、あなたはいくつかのオプションがあります。

  • を二重引用符であなたの引数を包みます。 (ただし、埋め込み引用符、[コマンド]、および$変数について心配する必要があります)
  • 引数を中括弧で囲みます。
  • 上記のように裸の単語を使用します(しかし、上記の中括弧、引用符、空白、および二重引用符の場合はすべてを心配する必要があります)

これはすべて、[文字列一致]に渡すものを決定することです.2番目のレイヤーは[文字列一致]がこのパターンをどのように扱うかに関係します(正規表現ではない、ちょうどglob-style patternです)。 tclのglobスタイルパターンには、*、?、[]、...のような特殊文字しかありません。これらのいずれかをリテラルとして扱うには、それらをエスケープする必要があります。他のものはリテラルマッチとして扱われるので、<>や/を心配する必要はありません。

string match *<FaultCode>9000</FaultCode>* $soap(Fault) 

しかし、あなたはまた、文体、マッチパターンをオフに設定するためにこれらのスタイルを使用することができます。

ので、この行は結構です。 string matchのみ特殊文字の

string match "*<FaultCode>9000</FaultCode>*" $soap(Fault) 
string match {*<FaultCode>9000</FaultCode>*} $soap(Fault) 
0

免責事項:TCLで、二重引用符"regex"または中括弧{regex}であなたの正規表現を囲むことをお勧めします

Apparently、私は、TCLを知っているだけで、正規表現はありません - あなたドン正規表現の予約文字ではないものをエスケープすることについて心配する必要はありません。

<>はエスケープする必要はありません。

周囲の項目として*を使用できることはわかりませんでした。これは予約済みの正規表現です。 この考えると、私の代わりにこれを行うことをお勧めしたい:{<FaultCode>9000</FaultCode>}

+0

私は*を正規表現のワイルドカードで意図した目的で使用していました。私は両側にあるものを信じています。それらの間の文字列が文字列のどこにあっても私が望むものなら真を返します。 – Joshua

+1

FYIの 'string match'は正規表現を使用していません。 –

+0

ああ、私の悪い - 私は "正規表現"タグで盲目的だった。 @ジョシュア、正規表現でワイルドカードを使用したい場合、 '*'のように見えます。 '*'はその前の項目に適用されるので、それ自体では使用しないでください。 –

1

別(および簡素IMO)のアプローチは、単なる文字列を検索することです検索はこのように、成功した場合、与えられた部分文字列の存在を参照してください。

set found [expr {[string first $needle $haystack] >= 0}] 

これは、文字列のどれもが、どのような方法エスケープについてとても心配に単なる検索解釈されますされています。

つまり、より重い持ち上げを目的としたツールを投げるのは簡単すぎる必要があります。たとえば、 "0から9までの範囲の隣接する文字のセットを含む部分文字列を<FaultCode>で始まり、"で終わる部分文字列を検索する必要がある場合は、正規表現またはグロブマッチングを使用するとよいでしょう。 </FaultCode> " - これは、正規表現エンジンでは特に、文字列からその不確定な部分文字列を抽出することを可能にします。

また、私はこのような場合に義務的な注意を払う必要があると感じます.XMLツールだけでXMLを解析するのは賢明ではありません。特に、tclsoaptdomがあります。

関連する問題