正则表达式循环查找每个查询 TCL 的第一个实例

标签 regex tcl

我有一个包含一些值的列表变量:

lappend list {query1}
             {query2}
             {query3}

还有 file1 中的一些数据,其中部分数据与上面的值匹配

query1 first data 
query1 different data
query1 different data
query2 another data  
query2 random data 
query3 data something 
query3 last data 

如何创建一个正则表达式循环,它只捕获每个查询中找到的第一个实例并将它们打印出来?在这种情况下,输出将是:

query1 first data
query2 another data 
query3 data something

尝试生成输出的代码

set readFile1 [open file1.txt r]
while { [gets $readFile1 data] > -1 } {
for { set n 0 } { $n < [llength $list] } { incr n } {
if { [regexp "[lindex $list $n]" $data] } {
puts $data
}
}
}
close $readFile1

我尝试在从文件中读取数据时使用 for 循环,但它似乎捕获了所有值,即使未使用 -all 选项也是如此。

最佳答案

如果文本文件较小,您可以使用 read 命令将文件作为一个整体读入变量。为内容应用 regexp,我们可以提取所需的数据。

set list {query1 query2 query3}
set fp [open file1.txt r]
set data [read $fp]
close $fp
foreach elem $list {
    # '-line' flag will enable the line sensitive matching
    if {[regexp -line "$elem.+" $data line]} {
        puts $line
    }
}  

如果假设文件太大而无法容纳,或者如果您考虑运行时内存使用,那么继续逐行读取内容。在那里我们需要控制已经匹配的内容,您可以保留一个数组来维护任何查询的第一次匹配是否匹配。

set list {query1 query2 query3}
set fp [open file1.txt r]
array set first_occurence {}
while {[gets $fp line]!=-1} {
    foreach elem $list {
        if {[info exists first_occurence($elem)]} {
            continue
        }
        if {[regexp $elem $line]} {
            set first_occurence($elem) 1
            puts $line
        }
    }
}
close $fp

引用:regexp

关于正则表达式循环查找每个查询 TCL 的第一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37535886/

相关文章:

javascript - 匹配重复模式

python - 如何删除文件中使用 python 中的正则表达式确定范围的行?

regex - VB.NET 中带拆分的正则表达式

tcl - 如何在 Tcl/Tk 中向 TreeView 添加复选框?

c# - 如何在现有的字母数字验证表达式中允许 esc 序列字符

linux - 如何从 tcl 脚本记录 xterm 窗口

regex - 我如何让 sqlite3 在 Tcl 中做正则表达式

tcl - 预期 Tcl 脚本 - 使用生成传递带引号的参数时出错

java - Java和TCL之间的套接字编程

python - 使用 re 在 python 上搜索十六进制数