在Tcl中使用正则表达式来解析一条线

时间:2016-08-26 14:15:55

标签: tcl

我需要一个正则表达式来分隔这个模式的左右部分。 。 。 。 。 : 例如。

Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . : alumnus.co.in
   Description . . . . . . . . . . . : Microsoft ISATAP Adapter
   Physical Address. . . . . . . . . : 00-00-00-00-00-00-00-E0
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes

并将它们存储到两个变量中。 我写了这个正则表达式

regexp {([[a-z]*[0-9]*.*[0-9]*[a-z]*]*" "):([[a-z]*[0-9]*.*[0-9]*[a-z]*]*)} 6*rag5hu. . :4ku5-1a543m match a b 

但它不起作用。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我会这样做:

set text {Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . : alumnus.co.in
   Description . . . . . . . . . . . : Microsoft ISATAP Adapter
   Physical Address. . . . . . . . . : 00-00-00-00-00-00-00-E0
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes}

foreach line [split $text \n] {
    if {[regexp {^(.+?)(?: \.)+ : (.+)$} $line -> name value]} {
        puts "$name => $value"
    }
}

输出

Media State => Media disconnected
   Connection-specific DNS Suffix  => alumnus.co.in
   Description => Microsoft ISATAP Adapter
   Physical Address. => 00-00-00-00-00-00-00-E0
   DHCP Enabled. => No
   Autoconfiguration Enabled => Yes

这使用非贪婪的量词(+?),并使正则表达式中的每个量词非贪婪。然后,您需要锚点,以便您要捕获的位包含您需要的所有文本。

答案 1 :(得分:0)

借用text

的定义
package require textutil

foreach line [split $text \n] {
    lassign [::textutil::splitx [string trim $line] {\s*(?:\. )+:\s*}] a b
    puts "a: $a\nb: $b"
}

给出输出

a: Media State
b: Media disconnected
a: Connection-specific DNS Suffix
b: alumnus.co.in
a: Description
b: Microsoft ISATAP Adapter
a: Physical Address
b: 00-00-00-00-00-00-00-E0
a: DHCP Enabled
b: No
a: Autoconfiguration Enabled
b: Yes

文档: foreachlassignpackageputssplitstringtextutil (package)