繁体   English   中英

如何在TCL中匹配整个单词? regexp“ \\\\ msub1 \\\\ M” sub1_ex

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM