Tcl 如何匹配regexp中的变量?

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("

我正在尝试编写一个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",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语法的任何特殊字符一样,它可能以不可预测的方式干扰模式。