如何在模式搜索中替换字符串变量

时间:2018-01-09 05:50:07

标签: regex tcl

在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

如何在模式搜索中替换字符串变量,我甚至使用了[...]但它无法正常工作

1 个答案:

答案 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]} …

请注意,在这两种情况下,使用大括号来阻止所有替换,然后substformat用于重写字符串中的所需元素。

在像

这样的交互式shell中试用模式是个好主意
% format {\s%s\s\w+\s\w+\s(\d+)} $name
\sthe\s\w+\s\w+\s(\d+)

这样,可以在插入regexp之前验证模式是否正常,并根据数据进行测试。

文档: formatregexpsubstSyntax of Tcl regular expressions