我需要搜索一个长词,然后再获取数字。
我会解释:如果我有这一行:
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 :(得分: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
答案 1 :(得分: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+ whitespaces \w+
- 一个或多个字母字母(字母/数字/ _
)\s+
- 1+空白符号cr_st\|altpll_component\|clk\[0]
- 文字字符串cr_st|altpll_component|clk[0]
(请注意|
和[
必须转义才能被视为文字字符,否则它们会被解析为正则表达式运算符)< / LI>
请注意- result
行中的regexp
:-
代表整场比赛(因为我们不感兴趣,-
很好)和{{1}将保留第一个(也是唯一的)捕获组的值。