2013-07-22 75 views
1

嗨我想只匹配變量的一部分,並將其存儲。例如,對於元素b12asc34sx110我想匹配b12asc34s,並將其存儲在一個變量中,並將x110存儲在另一個變量中。元素的值不斷變化,如可以是b12hdh56sx120或b12hdgwa78x20。我正在嘗試的代碼是如何使用正則表達式匹配字符串的一部分

set element b12asc34sx110 
regexp [\(.*)\ {[^x(0-9]}] $element matched1 
regexp [x(0-9)] $element matched2 
puts $matched1 
puts $matched2 

元素的值將來自用戶,因此它可能會改變everytime。 我是新來的正則表達式,因此發現它很困難。我沒有得到它的輸出。請幫我解決一下這個。

+0

這是什麼語言? – abiessu

+1

@abiessu:你可以在標籤中看到它是tcl。 –

+0

@CasimiretHippolyte:我現在明白了,謝謝。我期待問題的這一部分直接在問題中指定,但我會在將來觀察這些標籤。 – abiessu

回答

1

你可以這樣做:

#!/usr/bin/tclsh 

set element "b12asc34sx110" 
set pattern "(.*)(x.*$)" 

if {[regexp $pattern $element whmatch sub1 sub2]} { 
    puts $sub1 
    puts $sub2 
} 

注意:
,如果你在你的字符串數x,則第二捕獲組將開始在最後x,因爲第一量詞首先計算和貪婪(默認行爲),因此第一個捕獲組包含最大可能的子字符串。
如果您正在尋找最小的第一子,而不是使用這種模式(帶懶惰量詞):

set pattern "(.*?)(x.*$)" 
+0

強烈建議使用Tcl將正則表達式放在'{'大括號''''中,以避免無數問題。 –

+0

@DonalFellows:像這樣:'set pattern {(。*)(x。* $)}'? –

0

使用類似regexp {([^x]*)x([0-9]*)} "b12asc23sx110" matched1 sub1 sub2的正則表達式。

+0

如果我正在使用正則表達式(\。* \)[(^ x *)] $ ele匹配 以匹配第一部分,我得到一個錯誤:Error:unknown command'^ x *'(CMD-005) 如果我做了正則表達式{(\。* \)[(^ x *)]} $ ele匹配它顯示不平衡的偏見 – user2533429

+0

我發佈的正則表達式是'[^ x] *'(除x以外的所有字符的字符類,用*捕捉儘可能多的),它由'\('和'\)'圍繞它,然後是一個文字「x」,接着是[0-9]數字的字符類別,也被設置被捕獲。您應該在末尾使用兩個匹配變量來捕獲結果。考慮到您對解碼值的限制,使用拆分的另一個答案也非常好。 – abiessu

+0

我試過** regexp {\([^ x] * \)x \([0-9] * \)} $ ele matched1 matched2 **但是我得到一個0,因爲沒有字符得到匹配。你有什麼建議嗎? @abiessu – user2533429

0

如果「x」是一個常量,那麼你所要做的就是在x處分割第一個值,並將第一個值放在另一箇中 - 不管每邊的變化是什麼,但只有當「 x「是一個常量,並且會一直出現。爲了得到字母和數字,因爲我們沒有足夠的數據知道它是否總是在右邊的數字上,像(*)x(*)這樣的懶惰規則應該抓住x左邊的所有東西(假設這總是存在的)和右邊的所有東西。

+0

@CasimiretHippolyte是對的,我的規則是假設除了你給的中間樣本外不會出現其他的x,如果出現更多的樣本,他會更合適。 –

+0

也許,但由於上下文是未知的,你的方式可能會更好。 –

+0

如果我嘗試regexp {\([^ x] * \)x \([0-9] * \)} $ element matched1 matched2輸出即將來臨0也爲正則表達式{\(。* \)x \( 。*))$元素匹配1匹配2結果爲零 – user2533429

1

假設「X」可能不會出現在第二部分:

set element "b12asc34sx110" 
if {[set i [string last "x" $element]] >= 0} { 
    set head [string range $element 0 $i-1] 
    set tail [string range $element $i end] 
} 

如果「x」可能出現在第二部分但不在第一部分中,請將string last更改爲string first