向后搜索单词

时间:2017-04-18 21:02:06

标签: regex string tcl

我需要搜索一个长词,然后再获取数字。

我会解释:如果我有这一行:

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

2 个答案:

答案 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}将保留第一个(也是唯一的)捕获组的值。