Tcl では常に正規表現を中かっこで囲みます。
技術的には必要ありません (Tcl の言語定義を使用して、他の方法でバックスラッシュが必要になるかを正確に判断できます) が、通常遭遇する可能性が高いすべてのケースでより簡単です。
以下の例ではこれを使用します。
正規表現は、できるだけ早く一致を開始します。次に、通常の (貪欲な) 状況では、できるだけ多くのテキストに一致します。したがって、サンプル コードとテキストを使用して、マッチャーはR
最初の行の で照合を開始し、 まで消費し続けます。8
この時点で、 が一致して停止します。regexp
一致した部分文字列ではなく、一致した文字列のインデックスを報告するように依頼することで、これを確認できます (-indices
オプションを介して、マニュアル ページに記載されています)。
文字列内のすべての一致を取得するには、次の 2 つのオプションがあります。
-all -inline
にオプションを渡し、regexp
結果のリストを次のように処理しforeach
ます。
# Three variables in foreach; one for whole match, one for each substring
foreach {a b c} [regexp -all -inline {(RON)_([0-9]*)} $thedata] {
puts "matched '$a', with b=$b and c=$c"
}
-indices
オプションをオプションと一緒に使用して-start
、すべてwhile
ループ内で、文字列をステップ実行します。
set idx 0
while {[regexp -start $idx -indices {(RON)_([0-9]*)} $thedata a b c]} {
puts "matched at '$a', with subranges '$b' and '$c'"
set extracted [string range $thedata {*}$c]
puts "the extracted value is '$extracted'"
# Advance the place where the next search will start from
set idx [expr {[lindex $a 1] + 1}]
}
通常、最初のオプションを使用することをお勧めします。はるかに使いやすいです!より多くの情報を提供し、使用する中間ストレージが少ないため、2 番目の方が優れている場合もありますが、正しく理解するのははるかに難しいことでもあります。