Tcl 如何匹配regexp中的变量?
我正在尝试编写一个Tcl脚本,其中需要匹配正则表达式中的变量。 例如,该文件有一些包含“major”的代码行。在所有这些行中,我需要确定一个特定行:Tcl 如何匹配regexp中的变量?,tcl,Tcl,我正在尝试编写一个Tcl脚本,其中需要匹配正则表达式中的变量。 例如,该文件有一些包含“major”的代码行。在所有这些行中,我需要确定一个特定行: major("major",0x32) 我使用变量p1表示“major”(设置p1 major) 如何使用变量p1($p1)编写regexp来捕获特定的行 regexp -- "$p1\\(\"$p1\",0x32\\)" $line match 在tclsh中: % set line {major("major",0x32)} major("
major("major",0x32)
我使用变量p1表示“major”(设置p1 major
)
如何使用变量p1($p1
)编写regexp来捕获特定的行
regexp -- "$p1\\(\"$p1\",0x32\\)" $line match
在tclsh中:
% set line {major("major",0x32)}
major("major",0x32)
% set p1 major
major
% regexp -- "$p1\\(\"$p1\",0x32\\)" $line match
1
% puts $match
major("major",0x32)
在tclsh中:
% set line {major("major",0x32)}
major("major",0x32)
% set p1 major
major
% regexp -- "$p1\\(\"$p1\",0x32\\)" $line match
1
% puts $match
major("major",0x32)
使用字符串匹配
如果只想知道一行是否匹配,可以测试字符串匹配
,而不是正则表达式。这通常更快,也不那么挑剔。例如:
set fh [open /tmp/foo]
set lines [read $fh]
close $fh
set p1 major
set lines [split $lines "\n"]
foreach line $lines {
if {[string match *$p1* $line]} {set match $line}
}
puts $match
请注意,这将存储匹配的整行,而不仅仅是搜索模式。这可能是您想要的,但您的里程可能会有所不同。使用字符串匹配
如果只想知道一行是否匹配,可以测试字符串匹配
,而不是正则表达式。这通常更快,也不那么挑剔。例如:
set fh [open /tmp/foo]
set lines [read $fh]
close $fh
set p1 major
set lines [split $lines "\n"]
foreach line $lines {
if {[string match *$p1* $line]} {set match $line}
}
puts $match
请注意,这将存储匹配的整行,而不仅仅是搜索模式。这可能是您想要的,但您的里程数可能会有所不同。请注意,由于变量的内容嵌入到regex模式“原样”中,因此除非您完全控制变量内容,否则通常应将其转义,就像变量恰好包含regexp语法的任何特殊字符一样,它可能以不可预测的方式干扰模式。请注意,由于变量的内容嵌入到regex模式“原样”中,因此除非您完全控制变量内容,否则通常应将其转义,就像变量恰好包含regexp语法的任何特殊字符一样,它可能以不可预测的方式干扰模式。