在TCL中,我正在尝试使用正则表达式来模式化搜索。它在使用直接模式搜索时工作,但如果我使用模式的变量则不行。
例如:
set str "this is actual string to search the pattern"
set pat "the"
regexp {the} $str val
regexp {$pat} $str val1
puts $val; # it's working
puts $val1; # it's not working, showing error
如何在模式搜索中替换字符串变量,我甚至使用了[...]
但它无法正常工作
答案 0 :(得分:1)
在这种特殊情况下,您可以使用
regexp $pat $str val
大括号阻止了替换,因此您匹配文字字符串" $ pat"针对您的数据字符串。
如果在模式中有元字符和变量替换,如
if {[regexp -nocase \s$name\s\w+\s\w+\s(\d+) $str val val1]} …
你需要在允许另一个替换的同时阻止一个替换(反斜杠替换)。这可以通过
完成if {[regexp -nocase [subst -nobackslashes {\s$name\s\w+\s\w+\s(\d+)}] $str val val1]} …
(此开关可以缩短为-nob
),但subst
可能会非常棘手。获得以下权利更容易:
if {[regexp -nocase [format {\s%s\s\w+\s\w+\s(\d+)} $name] $str val val1]} …
请注意,在这两种情况下,使用大括号来阻止所有替换,然后subst
或format
用于重写字符串中的所需元素。
在像
这样的交互式shell中试用模式是个好主意% format {\s%s\s\w+\s\w+\s(\d+)} $name
\sthe\s\w+\s\w+\s(\d+)
这样,可以在插入regexp
之前验证模式是否正常,并根据数据进行测试。
文档: format, regexp, subst, Syntax of Tcl regular expressions