[英]how to match whole word in TCL? regexp “\\msub1\\M” sub1_ex
请帮我解决这个问题...
set var1 sub1
set var2 sub
set var3 sub1_ex
我想匹配$var1
和$var3
而不是$var2
即
regexp $var1 $var3
应该为1; regexp $var2 $var3
应该为0; 但是得到1。
我也试过
regexp "\\m$var1\\M" $var3
但得到0。
好吧,我想我终于设法解析了这个问题。
第一个问题是“ sub”是“ sub1”的子字符串,它们都是“ sub1_ex”的子字符串。
第二个问题是,就正则表达式引擎而言,“单词”是匹配类\\w
的相邻字符的连续块,该类同时包含字母数字和下划线(请参见this ),因此如果使用\\m
和\\M
来锚定模式“ sub1”,字符串“ sub1_ex”将不匹配,因为“ 1”和“ _”之间没有单词边界。
接下来要尝试的方法确实取决于您的用例,但是不幸的是我不太了解。 将var2
更改为读取sub\\M
可能会解决该问题,但我不确定这是否是您想要的。
您遇到的问题是单词字符类包含下划线字符,因此特殊的“单词开头/结尾”模式对您不起作用。
部分解决方案是使用更精细的匹配:
regexp "\\m${var1}(?!\[a-zA-Z0-9\])" $var3
这只适用于单词的结尾,而不适用于开头(Tcl中使用的RE引擎不支持任何形式的后向约束)。 因此,实际上更容易转换要匹配的字符串:
regexp "\\m$var1\\M" [string map {"_" " "} $var3]
如果您要查找的字符串不包含下划线,那将很好地工作。 我想您的情况是对的。 如果不是,则必须使用一个真正的技巧,并插入一些非常稀有的字符作为替换:
set mapping {"_" "\ufffd"}; # Unicode replacement char!
regexp "\\m[string map $mapping $var1]\\M" [string map $mapping $var3]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.