【问题标题】:Parse all matches in a string in tcl在 tcl 中解析字符串中的所有匹配项
【发布时间】:2014-03-03 09:33:40
【问题描述】:

我有一个字符串如下

set temp "
temp   : value
temp1  : value1
tempvalue
abc    = 23:445:726
abcdef = 456::985
abcdef = 123:45:7
abcdef = 098:45:56:8
"

在此我想要一个输出,其中“=”之后的值应设置为一个变量。输出应该是

"456::985 123:45:7 098:45:56:8".

我用过

set result [regexp "abcdef\\s*=\\s*(\\S*)" $temp match v1]

但无法获得全部

我已经使用带有 -inline -all 和 -line 的正则表达式得到答案,将结果存储在列表中,然后遍历它以获取值。我需要一个班轮

set result [regexp -inline -all -line "abcdef\\s*=\\s*(\\S*)" $temp]

输出是

{abcdef = 456::985} 456::985 {abcdef = 123:45:7} 123:45:7 {abcdef = 098:45:56:8} 098:45:56:8

然后遍历 this 将它们全部设置在一个字符串中。但我想知道是否有任何简单的方法可以做到这一点。 提前致谢。

【问题讨论】:

    标签: string tcl


    【解决方案1】:

    鉴于此示例,您不需要正则表达式。将行拆分为几段并创建一个新列表。

    set r {}
    foreach line [split $temp \n] {
        if {[string trim $line] eq ""} continue;             # skip blank lines
        lappend r [string trim [lindex [split $line =] end]]
    }
    puts $r
    

    这将给出一个列表,其中只有等号后面的位。如果你把它当作一个字符串,那么它就像一个字符串,列表中的每个元素都用空格分隔。

    【讨论】:

      【解决方案2】:

      这是另一种方法:将每一行视为 3 个标记:键、等号和值:

      set result {}
      foreach {key eq_sign value} $temp { lappend result $value }
      

      这种方法很容易理解,但是如果值中包含空格就行不通了。

      【讨论】:

        【解决方案3】:

        由于您使用的是面向行的匹配,因此请利用行锚:

        % regexp -inline -all -line {\S+$} $temp
        456::985 123:45:7 098:45:56:8
        

        所以,要将值保存为 字符串

        set values [join [regexp -inline -all -line {\S+$} $temp]]
        

        如果等号后面可能没有空格,请使用模式{[^=\s]+$}

        我的整个答案假设每行只有一个等号。


        响应更新的样本输入:

        foreach {m word} [regexp -inline -all -line {=\s*(\S+)$} $temp] {
            lappend words $word
        }
        puts [join $words]
        
        23:445:726 456::985 123:45:7 098:45:56:8
        

        【讨论】:

        • 感谢您的回答。但在我的情况下,我会有一些用“:”分隔的案例,这也会出现在结果中。您能否建议我一种不使用“-line”选项的方法。通过在 python 中使用正则表达式的反向引用
        • 如果您要更改要求,则必须更新您的问题以提供更好的示例。
        • 我已经修改过了,你现在可以检查一下
        猜你喜欢
        • 2015-06-22
        • 2013-10-14
        • 2023-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        • 2011-08-29
        相关资源
        最近更新 更多