有没有办法在regexp中使用列表索引?
我已尝试过这个,但它不起作用:
if {[regexp {.*\[lindex $mylist 2\].*} $mystring]} {
puts "OK"
}
位于名为mylist的列表的列表索引2处的值未在正则表达式中替换。
感谢。
答案 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命令替换了其中的所有内容,但反斜杠除外。