[英]How to substitute a string variable in a pattern search
在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
如何在模式搜索中替换字符串变量,我什至都用过[...]
但它不起作用
在这种情况下,您可以选择
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
并针对数据进行测试之前,可以验证该模式是否正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.