2017-04-18 91 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