reclx中的tcl list index

时间:2013-09-15 15:21:34

标签: regex list indexing tcl

有没有办法在regexp中使用列表索引?

我已尝试过这个,但它不起作用:

if {[regexp {.*\[lindex $mylist 2\].*} $mystring]} {
    puts "OK"
} 

位于名为mylist的列表的列表索引2处的值未在正则表达式中替换。

感谢。

3 个答案:

答案 0 :(得分:1)

我不确定为什么你这样使用正则表达式。你知道吗?你不必匹配整个字符串吗?

你应该可以使用:

if {[regexp [lindex $mylist 2] $mystring]} {
    puts "OK"
}

请注意,只要字符串中匹配 where ,regexp就会匹配并返回1.

但是,使用regexp元字符可能会给您带来意想不到的结果。如果[lindex $mylist 2]不包含任何内容,那么您应该很好。

除非列表中的元素是regexp字符串,否则不会出现任何问题。


如果列表元素中有元字符,则可以先使用另一个正则表达式来转义它们:

if {[regexp [regsub -all {[\]\[+*.^${}()?\\]} [lindex $mylist 2] {\\\0}] $mystring]} {
    puts "OK"
}

[regsub -all {[\]\[+*.^${}()?\\]} [lindex $mylist 2] {\\\0}][\[\]{}()?+*.^$\\]中的元字符添加反斜杠(即以下字符[]+{}()?+*.^$\

答案 1 :(得分:1)

如果您只想查看另一个简短字符串是否存在,regexp不是正确的方法。相反,请使用string first

if {[string first [lindex $mylist 2] $mystring] >= 0} {
    puts "OK"
}

如果列表在其第三个元素中确实有一个正则表达式,那么这就足够了,因为Tcl总是检测RE是否匹配任何地方(默认情况下它的模式是非锚定的):

if {[regexp -- [lindex $mylist 2] $mystring]} {
    puts "OK"
}

--以防止RE以-字符开头,这可能会导致混淆。您也可以使用regexp来处理string first配方:

if {[regexp ***=[lindex $mylist 2] $mystring]} {

string first的代码会更快!如果你想要比这更复杂的东西,那么停止并思考你所做的是否是正确的方法可能是一个好主意;当一个人发现自己在正则表达式中进行复杂的替换时,通常会陷入混乱。 (或者至少当我知道需要重新考虑时。)在这里询问 - 同时提供更多上下文 - 可以帮助你解决问题。

答案 2 :(得分:0)

问题是正则表达式中的大括号会阻止对list命令的评估。 有多种方法可以解决这个问题,其中一种方法是放弃大括号,并使用能够评估命令的引号。在这种情况下,您需要转义控制字符:

if {[regexp ".*\\[lindex $mylist 2].*" $mystring]} {
    puts "OK"
} 

或者您可以使用subst命令,但这将是详细的:

if {[regexp [subst -nobaclslashes {.*\[lindex $mylist 2\].*}] $mystring]} {
    puts "OK"
} 

启用了开关I的subst命令替换了其中的所有内容,但反斜杠除外。