0

TCL の正規表現について質問があります。regexp関数を使用してTCL文字列変数を
見つけて変更する方法. テキストの例: 受け取りたい: some text
/folder/folder2/test-c+a+t -test1 -test2
/folder/folder2/test-d+o+g

または、たとえば、次のようにすることもできます:
test-c+a+t
受信したい:
test-d+o+g

この追加について申し訳ありません:
この状況で:
/test-c+a+t/folder2/test-c+a+t -test1 -test2
私は受信したい:
/test-c+a+t/folder2/test-d+o+g -test1 -test2

4

3 に答える 3

3

ここで言及した特定のケースでは、文字列マップを使用することをお勧めします。ただし、正規表現はより柔軟であるため、タスクがどの程度具体的であるかによって異なります。

set modified [string map {test-c+a+t test-d+o+g} $original]

それ以外の場合は、正規表現構文の使用方法を学習する以外に方法はありません。これはいつでも役に立つので、マニュアル ページを読んで、さまざまな表現を試してみて、思ったものと一致しない場合はマニュアルを読み直してください。また、正規表現の使い方を学ぶために、sed、awk、および grep を試してください。

于 2012-07-20T10:57:18.907 に答える
3
% set old {/folder/folder2/test-c+a+t -test1 -test2}
/folder/folder2/test-c+a+t -test1 -test2
% set new [regsub {(test)-c\+a\+t.*} $old {\1-d+o+g}]
/folder/folder2/test-d+o+g

リテラル+記号は正規表現の量指定子であるため、エスケープする必要があることに注意してください。

http://tcl.tk/man/tcl8.5/TclCmd/re_syntax.htm
http://tcl.tk/man/tcl8.5/TclCmd/regsub.htm

于 2012-07-20T10:49:40.687 に答える
0

string mapuseまたは use regsub(おそらく-allフラグ付き)のいずれかです。2 つのアプローチの例を次に示します。

set myString [string map [list "test-c+a+t" "test-d+o+g"] $myString]
set myString [regsub -all "***=test-c+a+t" $myString "test-d+o+g"]
### Or equivalently, for older Tcl versions...
regsub -all "***=test-c+a+t" $myString "test-d+o+g" myString

string map1 回のスイープで複数の変更を適用できます (マッピングa b b aはすべてab文字を交換します) が、リテラル文字列のみを置き換え、可能なすべてのものを常に置き換えます。このregsubコマンドは、はるかに複雑な変換を行うことができ、何を置き換えるかについてより選択的に行うことができますが、正規表現を使用する必要があり、 astring mapが同等のジョブを実行できる場合は遅くなります。ただし、パターン内の特殊な先頭***=は、パターンの残りの部分がリテラル文字列であることを意味します。

于 2012-07-22T20:59:29.270 に答える