2017-11-28 22 views
0

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 
} 

答えて

2

通常は、特定の文字(バックスラッシュや角括弧など)をエスケープしないように正規表現を補う必要がありますが、正規表現内で変数を使用しているため、引用符を使用する必要があります。これは、これらの文字をエスケープする必要があることを意味します。それ以外の場合は、中括弧を使用した場合はエスケープする必要はありません。これらをエスケープすると、我々が得る:

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)があなたの文字列からの唯一の可能性である場合に限ります。

3

あなたは\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+).+$} 

ドキュメント: appendformatlistregexpstringsubstSyntax of Tcl regular expressions

+0

メモ欲張りマッチングについてのジェリーの指摘もあります。 –

関連する問題