我有一个搜索字符串.state_s[0]
和另外两个字符串列表:
{cache.state_s[0]} {cache.state_s[1]}
和
{cache.state_s[0]a} {cache.state_s[1]}
我需要命令Tcl解释器接受询问搜索字符串是否匹配字符串列表中的任何项目。同样非常重要的是,解决方案只应返回第一个列表的正面结果。我试过了:
set pattern {.state_s[0]}
set escaped_pattern [string map {* \\* ? \\? [ \\[ ] \\] \\ \\\\} $pattern]
set m1 {{cache.state_s[0]} {cache.state_s[1]}}
set m2 {{cache.state_s[0]a} {cache.state_s[1]}}
regexp $escaped_pattern $m1
regexp $escaped_pattern $m2
但是,上述命令在两次正则表达式调用时返回“1”。
基本上,我需要一种方法来检查一个子字符串(如[]之类的特殊字符是否在字符串的末尾。
答案 0 :(得分:1)
您将元素作为变量m1
中的列表。
set m1 {{cache.state_s[0]} {cache.state_s[1]}}
set m2 {{cache.state_s[0]a} {cache.state_s[1]}}
但是,当您对regexp
应用它时,Tcl会将输入m1
视为整个字符串,而不是列表。
由于列表中都包含字符串.state_s[0]
,regexp
将结果返回为1.
如果要为每个元素应用正则表达式,那么我建议使用带有lsearch
标志的-regexp
。
% set m1 {{cache.state_s[0]} {cache.state_s[1]}}
{cache.state_s[0]} {cache.state_s[1]}
% set m2 {{cache.state_s[0]a} {cache.state_s[1]}}
{cache.state_s[0]a} {cache.state_s[1]}
%
% lsearch -regexp -inline $m1 {\.state_s\[0]$};
cache.state_s[0]
% lsearch -regexp -inline $m2 {\.state_s\[0]$}
%
我在这里使用的模式是{\.state_s\[0]$}
。最后一个$
符号表示行尾。有了这个,我们确保元素中不再包含任何字符。我们没有逃避Tcl中的结束方括号]
。