检查字符串是否以子字符串Tcl结尾

时间:2018-01-11 20:22:44

标签: regex tcl match

我有一个搜索字符串.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”。

基本上,我需要一种方法来检查一个子字符串(如[]之类的特殊字符是否在字符串的末尾。

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中的结束方括号]