2

私はしばらくの間、Tcl の正規表現マッチング パターンについて疑問に思っていましたが、それがどのように機能しているのかについて困惑していました。ところで、私は Wish と Tcl/Tk 8.5 を使用しています。

ランダムな文字列がMmmasidhmMm保存されて$lineおり、コードは次のとおりです。

while {[regexp -all {[Mm]} $line match]} {
    puts $data $match
    regsub {[Mm]} $line "" line
}

$dataテキストファイルです。

これは私が得たものです:

m
m
m
m
m
m

私が期待していた間:

M
m
m
m
M
m

これを取得したときに、少し変更すると結果にどのように影響するかを確認するために、いくつかのことを試していました。

while {[regexp -all {^[Mm]} $line match]} {
    puts $data $match
    regsub {[Mm]} $line "" line
}

私は得る:

M
m
m

驚いたことに、$matchケースを保持します。

$match最初のケースでは、何らかの理由で自動的に小文字になるのはなぜだろうと思っていました。正規表現が実際にどのように機能するかを理解していない限り、何が間違っているのかわかりません。たぶん、私が知らないそれを修正するフラグがありますか?

いつかこの種のコードを実際に使用するかどうかはわかりませんが、それがどのように機能するかを学ぶことは、他の方法で役立つかもしれません. そこに何も見逃さなかったことを願っています。さらに情報が必要な場合はお知らせください。

4

1 に答える 1

5

ここでの鍵はあなたの-all旗にあります。そのためのドキュメントは次のように述べています。

-all-- 正規表現が文字列内で可能な限り多く一致するようにし、見つかった一致の総数を返します。これが一致変数で指定されている場合、それらには最後の一致の情報のみが含まれます。

つまり、変数matchには、小文字の「m」である最後の一致が含まれます。フラグをドロップする-allと、必要なものが得られます。

アップデート

大文字と小文字を問わずすべての 'm' を削除することが目標の場合、そのコード ブロック全体を 1 行にまとめることができます。

regsub -all {[MM]} $line "" line

または、より直感的に:

set line [string map -nocase {m ""} $line]; # Map all M's into nothing
于 2013-03-29T13:39:31.347 に答える