TCLで何らかの理由で40x12を抽出できないようです。これに関する助け?正規表現の助けと一致する数字
set l "zzzzzmbl01a40x12bbbbbbb"
set prefix "zzzzz"
if {[regexp "^${prefix}(.+)(l01|l02|l03|l04).+(\d+x\d+).+$" $l match var1 var2 var3]} {
puts $var1
puts $var2
puts $var3
}
TCLで何らかの理由で40x12を抽出できないようです。これに関する助け?正規表現の助けと一致する数字
set l "zzzzzmbl01a40x12bbbbbbb"
set prefix "zzzzz"
if {[regexp "^${prefix}(.+)(l01|l02|l03|l04).+(\d+x\d+).+$" $l match var1 var2 var3]} {
puts $var1
puts $var2
puts $var3
}
通常は、特定の文字(バックスラッシュや角括弧など)をエスケープしないように正規表現を補う必要がありますが、正規表現内で変数を使用しているため、引用符を使用する必要があります。これは、これらの文字をエスケープする必要があることを意味します。それ以外の場合は、中括弧を使用した場合はエスケープする必要はありません。これらをエスケープすると、我々が得る:
regexp "^${prefix}(.+)(l01|l02|l03|l04).+(\\d+x\\d+).+$" $l match var1 var2 var3
^^
これらは.+
ので、あなたの元の文字列でa4
にマッチします:
regexp "^${prefix}(.+)(l01|l02|l03|l04).+(\\d+x\\d+).+$" $l match var1 var2 var3
を今、これはの世話をしていることを、表現自体に最後の問題があります貪欲です。全体的に私は怠惰な数量詞を使用したり、より精密な正規表現を使用したりします(文字列の構造がわからないので、すべてのケースでうまくいかないかもしれません):
遅延句数量は、それは)ちょうど良く、他の全ての数量は怠け者することによって明示的だが、最初の1の後に怠惰になります。
regexp "^${prefix}(.+?)(l01|l02|l03|l04).+?(\\d+?x\\d+?)\\D.+?$" $l match var1 var2 var3
より正確な:
regexp -nocase "^${prefix}([a-z]*)(l01|l02|l03|l04)[a-z]*(\\d+x\\d+).+?$" $l match var1 var2 var3
改善することができたもう一つのことがあり、 (l01|l02|l03|l04)
は技術的には可能です(l0[1-4])
で置き換えられますが、(l01|l02|l03|l04)
があなたの文字列からの唯一の可能性である場合に限ります。
あなたは\d
秒でバックスラッシュを倍にする必要があります:あなたは、中括弧で囲まれていない引数を渡すたび
regexp "^${prefix}(.+)(l01|l02|l03|l04).+(\\d+x\\d+).+$" $l ...
、それらはコマンドに渡される前に評価されます。この場合、パターン引数の中の変数の値を代入したいので、これを行う必要があります。評価された引数は、トリッキーなことができますが、簡単なトリックは、私たちはそれらを検査することができます:list
コマンドが呼び出されると
% regexp "^${prefix}(.+)(l01|l02|l03|l04).+(\d+x\d+).+$" $l
0
% list regexp "^${prefix}(.+)(l01|l02|l03|l04).+(\d+x\d+).+$" $l
regexp {^zzzzz(.+)(l01|l02|l03|l04).+(d+xd+).+$} zzzzzmbl01a40x12bbbbbbb
は、すべての引数が評価され、その後、彼らは、評価の形で返されます。今では、評価が\d
からバックスペースから削除されたことを簡単に確認できます。
不要な評価を避けるために、一つは限られたsubst
を使用することができます。
% subst -nocommands -nobackslashes {^${prefix}(.+)(l01|l02|l03|l04).+(\d+x\d+).+$}
^zzzzz(.+)(l01|l02|l03|l04).+(\d+x\d+).+$
(あなたはオプションを省略することができます。-noc
、-nob
)同じ結果を得るために
もう一つの方法は、使用することですformat
:
format {^%s(.+)(l01|l02|l03|l04).+(\d+x\d+).+$} $prefix
のTcl 8.6.2では
以降、あなたはこれを行うことができます。
をあなたは、このようにそれを行うことができ、以前のバージョン(変数pat
を作成します)で
string cat^$prefix {(.+)(l01|l02|l03|l04).+(\d+x\d+).+$}
:
append pat^$prefix {(.+)(l01|l02|l03|l04).+(\d+x\d+).+$}
ドキュメント: append、 format、 list、 regexp、 string、 subst、 Syntax of Tcl regular expressions
メモ欲張りマッチングについてのジェリーの指摘もあります。 –