2012-01-03 9 views
0

1である必要があり、私は$var1$var3なく$var2すなわちTCLで単語全体をどのように一致させるか?正規表現 "\ MSUB1 \ M" sub1_ex

regexp $var1 $var3をマッチさせたい...これを解決するに

set var1 sub1 
set var2 sub 
set var3 sub1_ex 

を助けてください。 regexp $var2 $var3は0にする必要があります。しかし、1

なって、私はまた、私は私が最終的に質問を解析するために管理を考える、

regexp "\\m$var1\\M" $var3 

を試みたが、0

答えて

0

がわかりました。

第1の問題は、「sub」が「sub1」の部分文字列であり、両方が「sub1_ex」の部分文字列であることです。

第二の問題は、あなたが係留する\m\Mを使用するので、もし、正規表現エンジンの面で「言葉」は、(thisを参照)、英数字とアンダースコアの両方を含んでいるクラス\wに一致する隣接する文字のcontigousブロックであるということですパターン "sub1"の場合、 "1"と "_"の間に単語境界がないので、文字列 "sub1_ex"は一致しません。

次に試してみるものは、実際にあなたのユースケースに依存しています。残念なことに、私はそれをかなり得ていません。 var2sub\Mと読み替えると、おそらくそれが修正されますが、それがあなたの望むものかどうかはわかりません。

0

問題は、単語の文字クラスにアンダースコアが含まれていることです。そのため、特殊な「開始/終了の単語」パターンは機能しません。

部分ソリューションは、より精巧な一致を使用することです:

regexp "\\m${var1}(?!\[a-zA-Z0-9\])" $var3 

これは、単語の最後に動作しますが、開始時(Tclで使用REエンジンは、いずれかの種類をサポートしていないではありませんlookbehind制約の)。細かいあなたがアンダースコアが含まれていない見つけるためにしようとしている文字列を提供いきます

regexp "\\m$var1\\M" [string map {"_" " "} $var3] 

:したがって、に対して照合された文字列を変換するために、実際に簡単です。私はあなたの事実に当てはまると思います。また

set mapping {"_" "\ufffd"}; # Unicode replacement char! 
regexp "\\m[string map $mapping $var1]\\M" [string map $mapping $var3] 
+0

問題になるため、文字列のREメタ文字が検索されていることに注意してください。そうでない場合、あなたは本物のトリックを使用し、交換などのいくつかの本当にまれな文字を挿入する必要があります。 –

関連する問題