tcl查询字符串模式匹配

时间:2015-11-22 05:15:57

标签: php unix tcl

我有一个Tcl变量,其中包含以下内容:

m_hscaclbmbmmer_v11_2 
m_letmmcbterbox_v1_2 
m_osbbbbcmd_v16_0 v_proc_ss_v1_0 
m_rmgbbb2cycrcb_v17_4
m_nscalbbbcer_v8_2
m_smpte2mbbc022_m12_rx_v2_3
m_smpte2m02cm2_12_tx_v2_2
m_smpte20m2mcm2_56_rx_v5_4
m_smpte202m2_c56_tx_v4_0 
m_smpbbbte_sdbbci_v3_0
m_smpte_uhdmsdic_v1_2
m_tmmmc_v6_4 
m_tpmmmg_v17_1
m_vcresamcpler_v1_2
m_vid_mminc_axi4s_v14_1
m_voip_femcc_rx_v11_3
m_voip_fmbmecc_tx_v1_2
m_vscalebcr_v1_4
m_ycrcb2bncrgb_v7_4
mid_phy_cnmcbmbontroller_v2_2
mibmmbbo_v3_4
miterbcbmbi_v9_4
madc_wicbmbz_v3_4
mambmbuic_v12_2  mvxfftc_v9_4

姓氏mvxfftc_v9_4需要更改为microsemi.com:ip:mvxfft:9.4,同样需要对所有名称进行更改。我该怎么做?

2 个答案:

答案 0 :(得分:1)

问题稍微不明确,但我假设您正在使用这样的每个名称(标记要提取的部分):

mvxfftc_v9_4
^^^^^^   ^ ^

并将其转换为(标记插入的部分):

microsemi.com:ip:mvxfft:9.4
                 ^^^^^^ ^ ^

regsub来说并不太难,因为我们正在将格式良好的单词更改为格式良好的单词,我们可以直接将它作为字符串处理直接用于变量,而无需映射它在列表上明确地说:

set changed [regsub -all {\y(\w+)\w_v(\d+)_(\d+)\y} $original {microsemi.com:ip:\1:\2.\3}]
# \y is a beginning-or-end-of-word anchor
# \w means any alphanumeric-or-underscore
# \d means any digit
# \1, \2 and \3 are substituted by the parenthesised matches

您可以通过这种方式对映射的复杂性进行限制,但这可能就足够了。

答案 1 :(得分:0)

也许你可以尝试(假设你的名字列表在name中):

foreach name $names {
    puts microsemi.com:ip:[regsub {_v(\d)_(\d)$} $name {:\1.\2}]
}

这不是很漂亮,但它确实表达了你想要完成的事情。

如果你想要一个列表而不是打印输出,你可以使用它(Tcl 8.6或更高版本,留下结果result):

set result [lmap name $names {
    lindex microsemi.com:ip:[regsub {_v(\d)_(\d)$} $name {:\1.\2}]
}]

或者这个(大多数版本):

set result {}
foreach name $names {
    lappend result microsemi.com:ip:[regsub {_v(\d)_(\d)$} $name {:\1.\2}]
}

文档:foreachlappendlindexlmaplmap替代,putsregsub,{{ 3}}

关于正则表达式写作:

还有一些网站致力于各种编程语言的正则表达式:Google搜索应该可以为您提供帮助。