set pattern {\Q[9]_i_1_n_0}
string first $pattern $pattern
# => 0
匹配与string first
两个字符串的文本内容进行比较,而不给予任何特殊含义的字符。 0的结果意味着在位置0处找到匹配(如果没有匹配,则得到-1)。 string first
不会告诉你,如果你找到了一个完全匹配:因为你需要确定结果是0和字符串的长度是相同的。
通过“glob-style”/“字符串匹配”或正则表达式进行匹配需要考虑那些匹配语言特殊的字符。例如,\
,*
,?
,[
,]
在全局样式匹配特殊,和\
,.
,*
,+
,?
,{
,}
,(
,)
,^
,$
在正则表达式匹配特殊。这里的“特殊”是指例如\
并不意味着“反斜杠”,而是(在两种情况下)“逃逸”,即一个带走另一个角色的“特殊性”的角色。这意味着例如\\
确实意味着反斜杠,并且\*
确实意味着星号。
由于您使用的模式中包含的模式,可用于全局样式或正则表达式匹配前两个\
,[
和]
,他们需要进行转义。 (事实上,通过语法怪癖,一个]
封闭转义[
不需要进行转义。)
一个逃脱这些字符的最简单的方法是通过使用由string map
命令执行的字符串翻译操作。有人会认为,这将这样的伎俩:
string map {\ \\ [ \[} $pattern ;# error! this code won't work!
但不会工作,因为反斜杠仍处于string map
命令特殊。我们需要在地图反斜线的数量就会翻一番:
string map {\\ \\\\ [ \\[} $pattern
,现在我们可以尝试使用通配符式样/正则表达式匹配:
string match [string map {\\ \\\\ [ \\[} $pattern] $pattern
# => 1
regexp [string map {\\ \\\\ [ \\[} $pattern] $pattern
# => 1
1的结果意味着布尔真理:一个比赛被发现。需要注意的是,如果有一个前缀和/或后缀的结果会有所不同:
string match [string map {\\ \\\\ [ \\[} $pattern] abc${pattern}def
# => 0
regexp [string map {\\ \\\\ [ \\[} $pattern] abc${pattern}def
# => 1
这是因为该字符串匹配的模式的两端隐含固定,而正则表达式需要显式地锚,否则将忽略前面或后面的文本。
匹配在一个列表中是类似的。 lsearch -exact
的作品类似string first
,只不过它只接受完全相同的字符串。 lsearch -regexp
和lsearch -glob
分别像正则表达式和全局样式匹配一样工作。
set list [concat abc $pattern def]
# => abc \Q[9]_i_1_n_0 def
lsearch -exact $list [join $pattern]
# => 1
lsearch -regexp $list [string map {\\ \\\\ [ \\[} [join $pattern]]
# => 1
lsearch -glob $list [string map {\\ \\\\ [ \\[} [join $pattern]]
# => 1
这里1的结果表示列表中的第二个元素(索引1)与模式匹配。
(利用的concat
和join
是有点低级别欺骗的,以避免在字符串表示在大括号中的方式获得。)
文档:concat,join,lsearch,Syntax of Tcl regular expressions,regexp, string
你试过双反斜杠吗?\\\'? –
http://stackoverflow.com/questions/19495405/tcl-backslash-issue-regsub –