tcl中的正则表达式无法正常工作

Pun*_*tal 3 regex tcl

这个东西杀了我,我想我在tcl正则表达式中缺少非常基本的概念.我有以下代码

foreach line $data {
    if {[regexp {^(\#|\s)} $line]} {continue;} else {[lappend $puneet "$line"];}
}
Run Code Online (Sandbox Code Playgroud)

所以我有可变行,它可以有一个' #'作为它的第一个字符,或' \s'空格或普通的字母数字字符.现在我想要的是创建一个仅包含字母数字字符作为第一个字符的行列表.

但由于某些我无法找到的语法问题,上面的代码似乎没有给出所需的输出.这是非常基本的,但由于我仍然是正则表达式的新手,我不确定我是否遗漏了上述表达式中的任何括号.

Joh*_*uhn 5

问题出在你的if陈述的最后部分:

[lappend $puneet "$line"];
Run Code Online (Sandbox Code Playgroud)

这将使用变量当前值的名称将行的匹配附加到punneet变量.之后,它尝试查找具有当前行名称的命令,该命令可能会失败.

正确的是:

foreach line $data {
    if {[regexp {^(\#|\s)} $line]} {continue} else {lappend puneet $line}}
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Tcl 8.6,则可以将整个内容编写为:

set puneet [lmap line $data {if {[regexp {^(\#|\s)} $line]} {continue}; set line}
Run Code Online (Sandbox Code Playgroud)