2013-07-26 311 views
0

我是tcl的新學習者。使用regsub時遇到以下問題。考慮以下情形:需要tcl命令使用方面的幫助regsub

set test1 [list prefix_abc_3 abc_1 abc_2 AAA_0] 

set test2 abc 

regsub -all ${test2}_[1-9] $test1 [list] test1 

我預計$test1 output is [prefix_abc_3 AAA_0]

然而regsub還取消了部分匹配的字符串是prefix_abc_3。有沒有人有任何想法如何Regsub只在列表中確切的話?

我試圖通過網絡找到解決方案,但無法獲得任何線索/提示。感謝這裏有人能幫助我。

+0

在[1-9]之前使用反斜槓(產生\\ [1-9 \\]),因爲否則它將看到1-9作爲要執行的命令。 – Roalt

回答

1

\m and \M正則表達式分別匹配單詞的開始和結尾。但是你在test1中沒有一串單詞,而是一個元素列表,有時候也有差別,所以不要混合這兩個單詞。如果該模式是簡單的,你可以使用-glob選項(默認值),而不是-regexp,也許節省一些處理器時間

set test1 [list prefix_abc_3 abc_1 abc_2 AAA_0] 
set test2 abc 
set test1 [lsearch -all -inline -not -regexp $test1 "^${test2}_\[1-9\]\$"] 

regsub只處理字符串,而lsearch作品與名單。

+0

你已經解決了我的疑問。感謝開明的我Potrzebie。讚賞了很多:) – user2622414

+0

8.6:'lmap元素$ test1 {regsub $ test2 $元素「」}' –

+0

@ user2622414如果您接受答案,請點擊左上方的複選標記。 – potrzebie

0

什麼究竟是你執行了嗎?

當我輸入上述命令到tclsh,它會顯示一個錯誤 -

% set test1 [list prefix_abc_3 abc_1 abc_2 AAA_0] 
prefix_abc_3 abc_1 abc_2 AAA_0 
% set test2 abc 
abc 
% regsub -all ${test2}_[1-9] [list] test1 
invalid command name "1-9" 

我不能確定你正在嘗試做的。您首先將test1 inisitalising作爲列表。然後將它作爲字符串將其傳遞給regsub。這是一件完全合法的事情,但可能表明你對某事感到困惑。您是否試圖通過將其應用四次來測試您的替換:prefix_abc_3,abc_1,abc_2AAA_0中的每一個?你當然可以做你的方式,而是一種更自然的方式是做

foreach test $test1 { 
    regsub $pattern $test [list] testResult 
    puts stdout $testResult 
} 

再說,什麼是你想實現你的替代?它看起來好像你試圖用一個空字符串替換字符串abc,即完全刪除它。通過[list]作爲空字符串是完全有效的,但可能指示列表和字符串之間的混淆。

達到你想要的結果,所有你需要做的就是添加一個領先的空間,你的模式,通過一個空格作爲替換字符串和逃逸的方括號,即

regsub -all " ${test2}_\[-9\]" $test1 " " test1 

但我懷疑這是一個虛構的例子,你真的想做一些稍微不同的事情。

編輯

爲了獲得一個只包含不準確的模式匹配列表項的列表,我建議

proc removeExactMatches {input} { 
    set result [list];  # Initialise the result list 
    foreach inputElement $input { 
     if {![regexp {^abc_[0-9]$} $inputElement]} { 
      lappend result $inputElement 
     } 
    } 
    return $result 
} 

set test1 [removeExactMatches [list prefix_abc_3 abc_1 abc_2 AAA_0]] 

注:

我)我不根本不使用regsub。

II),雖然它的安全和合法的列表和字符串之間切換左右,這一切都需要時間,它掩蓋什麼,我tryng做的,所以我避免它儘可能。你似乎有一個字符串列表,你想刪除它們中的一些,所以這就是我在我建議的解決方案中使用的。 Tcl中的正則表達式命令處理字符串所以我傳遞它們的字符串。

iii)爲確保列表元素完全匹配,我使用^$將模式錨定到匹配的字符串的開始和結尾。

iv)爲了防止解釋器識別正則表達式模式中的[1-9]並嘗試執行(不存在)命令1-9,我將整個模式字符串括在大括號內。

V)對於較大的通用性,我可能想通過模式的PROC以及輸入列表(串),在這種情況下,我會做

proc removeExactMatches {inputPattern input} { 
    . 
    . 
    . 
    set pattern "^" 
    append pattern $inputPattern 
    append pattern "\$" 
    . 
    . 
    . 
     if {![regub $pattern $inputElement]} { 
     . 
     . 
     . 
} 

set test1 [removeExactMatches {abc_[1-9]} {prefix_abc_3 abc_1 abc_2 AAA_0}] 

,以儘量減少數量必須逃脫的角色。 (實際上我可能不會使用proc內的開始和結束錨點的引號 - 他們並不是真的需要,我是一個懶惰的打字員!)

看着你的原始問題,看起來你可能只想改變abc模式的一部分,在這種情況下,您可能只想將其傳遞給proc並附加_[0-9]以及其中的錨點 - 不要忘記跳過方括號或使用大括號如果你走這條路。

+0

嗨Nurdglaw, 感謝您檢查我的疑問。實際上你已經錯過了regsub命令中的$ test,這是它標記錯誤的原因。 您的試用命令%regsub -all $ {test2} _ [1-9] <錯誤$ test1 here> [list] test1 – user2622414

+0

您的foreach示例是替換方法之一,但它們可能無法生成輸出我尋找,因爲他們將取代任何匹配abc_ 模式爲null。而我所做的只是替換整個匹配的確切字符串abc_ 而已。 下面 正顯示出之前我所期望從結果 獲得:TEST1是一個列表[prefix_abc_1 abc_1 abc_0 abc_6高清]與llength = 5 後:test1的是[prefix_abc_1高清]與llength = 2 希望清單這會讓你明確我的問題。謝謝:) – user2622414