试图从字符串中提取模式

时间:2016-01-11 19:47:57

标签: regex tcl regexp-substr

我有一个像

这样的字符串
set arr_set(variable.abc) {12,13}
set arr_set(variable.def) {15,16}
set arr_set(dont_care)    {0,0}

其中arr_set是一个数组集,variable_abc是它的一个元素。我将所有这些信息存储在一个文件中。我想做的是,阅读每一行,无论我在哪里看到"变量。"我读了它指向的内容,就像在第一种情况下,它指向abc,然后指向def

我写了这个脚本,但显然没有存储信息。

regexp -nocase {^\s*set arr_set[(]variable\s*.\s*(.*)$} $lines match tag value

其中lines是包含

的字符串
set arr_set(variable.abc) {12,13}

我无法弄清楚这里遗漏的正则表达式是什么。有人可以看看吗?

2 个答案:

答案 0 :(得分:2)

分解你的正则表达式:

^\s*set arr_set[(]variable\s*.\s*(.*)$
  • ^:行锚的开头
  • \ s *:零个或多个空格
  • set arr_set [(]变量:完全匹配此文本
  • \ s *:零个或多个空格
  • 。 :任何角色
  • \ s *:零空间
  • (。*):其余数据

您的正则表达式没有标记和值的单独组,但是从您的代码中,您似乎希望它们分开。您有额外的空间匹配,与您的数据不匹配。

set lines {set arr_set(variable.abc) {12,13}}
regexp -nocase {\(variable\.([^)]*)\)\s*(.*)} $lines match tag value
puts "$tag $value"

regexp -nocase {^\s*set\s*arr_set\(variable\.([^)]*)\)\s*(.*)} $lines match tag value

分解:

\(variable\.([^)]*)\)\s*(.*)
  • \(变量\。:完全匹配此文字
  • (:begin group(tag)
  • [^]] *:零个或多个不是紧密括号的字符
  • ):结束组(标记)
  • \):密切括号(完全匹配)
  • \ s *:零个或多个空格
  • (。*):其余数据(值)

答案 1 :(得分:2)

(Glenn Jackman在评论中提醒我array names可以采用全局模式来选择名称。由于该功能在这种情况下显着简化了代码,我已经重写了我使用它的答案。)

如果你有命令

set arr_set(variable.abc) {12,13}
set arr_set(variable.def) {15,16}
set arr_set(dont_care)    {0,0}

在您source的文件中,您可以使用此文件获取标记值对的列表:

lmap name [array names arr_set variable.*] {
    set tag [lindex [split $name .] 1]
    list $tag $arr_set($name)
}

# => {abc 12,13} {def 15,16}

(如果您不想要该值,请使用set tag代替list $tag $arr_set($name)

对于Tcl 8.5及更早版本,这样做(将结果存储在res中):

set res {}
foreach name [array names arr_set variable.*] {
    set tag [lindex [split $name .] 1]
    lappend res [list $tag $arr_set($name)]
}

(如果您不想要该值,请使用lappend res $tag代替lappend res [list $tag $arr_set($name)]

请注意,只有在数组名称选择可以表示为glob模式时,此解决方案才有效。在不可能的情况下,仍然需要沿着这些方向的解决方案:

lmap name [array names arr_set] {
    lassign [split $name .] prefix tag
    if {$prefix in {foo bar baz}} {
        list $tag $arr_set($name)
    } else {
        continue
    }
}

文档:arraycontinueforeachiflappendlassignlindex,{{3 }},listlmap替换,lmapsetsource