2017-04-18 100 views
1

我需要搜索一個長字,然後獲取數字。向後搜索字詞

我來解釋一下:如果我有這樣一行:

208.86 Mhz cr_st|altpll_component|clk[0] 

我需要查找的字符串cr_st|altpll_component|clk[0], 然後我需要設置一些變量以字符串208.86 Mhz

我試着用搜索字符串

set timing_file [open $link/temp_st.sta.rpt] 
while {[gets $timing_file line] != -1} { 
incr line_num 
if {[regexp {cr_st|altpll_component|clk[0]\s+(.*)} $line all FEC_CLK]} { 
    puts $line_num 
} 
} 
close $timing_file 
+0

什麼是你的問題?你期望會發生什麼以及會發生什麼? – mkrieger1

回答

0

所有你需要的是使用一個特定的模式一定的「硬編碼」字符串之前提取數字和單詞這樣做。

使用捕獲組圍繞你需要提取和使用

set a {208.86 Mhz cr_st|altpll_component|clk[0]} 
regexp {(\d[\d.]*\s*\w+)\s+cr_st\|altpll_component\|clk\[0]} $a - result 
puts $result 

Tcl demo圖形部分。如果您需要使編號匹配部分更加精確,則可以使用\d+(?:\.\d+)?。請參見下面的解釋:

  • (\d[\d.]*\s*\w+) - 捕捉第1組:
    • \d[\d.]* - 數字(\d),接着用0+數字或點(作爲替代,可以使用\d+(?:\.\d+)?:1+位數( \d+),隨後用1點或0的出現(即,可選的)的點的和1+位數)
    • \s* - 0+空格
    • \w+ - 1以上字字符(字母/數字/ _
  • \s+ - 1+空格符號
  • cr_st\|altpll_component\|clk\[0] - 一個字符串cr_st|altpll_component|clk[0](注意|[必須逃脫被視爲文字字符,否則會被解析爲正則表達式運算符)

請注意- resultregexp行:-代表整個比賽(因爲我們沒有興趣,-罰款)和result將保存第一個(也是唯一)捕獲組的值。

1

我建議你使用scan來獲得值和單位。確保測試你得到兩個。

if {[regexp {cr_st|altpll_component|clk[0]\s+(.*)} $line all FEC_CLK]} { 
    # new code 
    if {[scan $line {%f %s} value unit] == 2} { 
     set some_variable "$value $unit" 
    } 
    # end new code 
    puts $line_num 
} 

文檔: scan