当搜索字符串包含变量和空格时,如何使用Tcl regexp?

时间:2016-02-18 19:08:46

标签: regex tcl

以下是我希望使用Tcl $line$ramregexp匹配的代码。

set line {      0    DI   /hdamrf};
set ram {/hdamrf};
regexp {\s+\d\s+DI\s+$ram} $line match; ## --> 0

请帮我构建一个可以匹配正则表达式的搜索字符串。碰巧在搜索字符串中使用变量时,必须将它们括在花括号中。但花括号不允许我使用\s来检测空白区域。感谢。

2 个答案:

答案 0 :(得分:3)

这是一种可能性:

regexp [format {\s+\d\s+DI\s+%s} $ram] $line match

这是另一个:

regexp "\\s+\\d\\s+DI\\s+$ram" $line match

文档:formatSyntax of Tcl regular expressionsregexp

答案 1 :(得分:1)

以这种方式尝试:

regexp [subst -nocommands -nobackslashes {\s+\d\s+DI\s+$ram}] $line match

例如:

% regexp [subst -nocommands -nobackslashes {\s+\d\s+DI\s+$ram}] $line match
1

请参阅subst here的手册页:

  

此命令对其字符串参数执行变量替换,命令替换和反斜杠替换,并返回完全替换的结果。以与Tcl命令完全相同的方式执行替换。结果,字符串参数实际上被替换了两次,一次是Tcl解析器,一次是Tcl命令,一次是subst命令。

     

如果指定了-nobackslashes-nocommands-novariables中的任何一个,则不会执行相应的替换。例如,如果指定了-nocommands,则不执行命令替换:打开和关闭括号被视为普通字符,没有特殊解释。

因为它已经在{...}中,所以关于解析器解释它的部分两次并不完全准确:)