2017-10-24 4 views
1

リスト内の最初と最後に一致する単語や正規表現を見つける方法を探しています。以下のようなリスト内で最後に一致する正規表現を検索する方法

何か:正規表現は非常に遅くなることが

set list "The dog rant to the field by the red house..." 

set first [lsearch -regexp $list \[Tt\]he] 
($first =0) 
set last [lsearch -last -regexp $list \[Tt\]he 
($last=7) 

答えて

1
set res [lsearch -nocase -all $list the] 
set first [lindex $res 0] 
set last [lindex $res end] 

あなたが特に大文字HまたはEを除外(または単語の境界を探してください)する場合を除き、この1つは同等であり、約4倍の速さ。

+0

ピーターは、私は「」を使用しますが、私は必要私の実際の例の正規表現。それは、あなたの例のロジックが私にとって完璧に機能すると言っています!ありがとうございました! –

1

ので、それはターゲットラインを複数回検索するよりも、一度だけではなく、正規表現を実行するのが最善です。

set list "The dog rant to the field by the red house..." 
    set matches [regexp -inline -all {[Tt]he} $list] 
    set first [lindex $matches 0] 
    set last [lindex $matches end] 

あなたは試合が配置されている$リストにインデックスが必要な場合は、 -indicesオプションを使用します。

set matches [regexp -indices -inline -all {[Tt]he} $list] 

参考文献:regexp

1

実際のデータと一致した分布の長さに応じて、それは逆リストで検索を行うと変換するのが最も簡単かもしれません:

set ridx [lsearch -regexp [lreverse $list] {[Tt]he}] 
set last [expr {[llength $list] - 1 - $ridx}] 
+0

リバース機能があることはわかりませんでした!それは間違いなく便利になるでしょう!ありがとうございました –

関連する問題