ZetCode

Tcl regexp 命令

最后修改于 2025 年 4 月 3 日

Tcl 的 regexp 命令将正则表达式与字符串进行匹配。它是模式匹配和文本提取的强大工具。如果模式匹配成功,该命令返回 1,否则返回 0。

基本定义

正则表达式是用于匹配字符串中字符组合的模式。regexp 命令遵循此语法:regexp ?开关? exp string ?matchVar? ?subMatchVar ...?

exp 是正则表达式模式。string 是要匹配的输入文本。可选的匹配变量用于存储匹配的子模式。

简单模式匹配

此示例演示了 regexp 的基本模式匹配。我们检查字符串是否包含数字。

simple_match.tcl
set text "Order 12345 was placed on 2023-05-15"
if {[regexp {\d+} $text]} {
    puts "Digits found in text"
} else {
    puts "No digits found"
}

模式 \d+ 匹配一个或多个数字。如果找到任何数字,该命令将返回 1。匹配结果用于条件语句。

提取匹配项

此示例展示了如何使用匹配变量提取匹配的子字符串。

extract_match.tcl
set email "john.doe@example.com"
regexp {([^@]+)@(.+)} $email full user domain
puts "Full: $full"
puts "User: $user"
puts "Domain: $domain"

该模式捕获电子邮件地址的用户名和域名部分。第一个捕获组 ([^@]+) 匹配 @ 之前的所有内容。第二个 (.+) 匹配之后的所有内容。变量存储匹配项。

不区分大小写的匹配

-nocase 开关启用不区分大小写的模式匹配。

nocase_match.tcl
set text "The Quick Brown Fox"
if {[regexp -nocase {quick} $text]} {
    puts "Found 'quick' (case insensitive)"
}

如果没有 -nocase,该模式将仅匹配小写的 'quick'。该开关使匹配不区分大小写,因此它会匹配文本中的 'Quick'。

锚定匹配

锚定确保模式在字符串的特定位置进行匹配。

anchored_match.tcl
set names [list "John Smith" "Alice Johnson" "Smith Brown"]
foreach name $names {
    if {[regexp {^Smith} $name]} {
        puts "$name starts with Smith"
    } elseif {[regexp {Smith$} $name]} {
        puts "$name ends with Smith"
    }
}

^ 将匹配锚定到字符串的开头,而 $ 将匹配锚定到字符串的末尾。脚本检查 'Smith' 是否出现在每个名字的开头或结尾。

高级子模式提取

此示例演示了如何从复杂字符串中提取多个子模式。

subpatterns.tcl
set log "ERROR 2023-05-15 14:30:45 [MainThread] Connection timeout"
regexp {(\w+)\s+(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2}:\d{2})\s+\[(\w+)\]\s+(.*)} \
    $log level date time thread message
puts "Level: $level"
puts "Date: $date"
puts "Time: $time"
puts "Thread: $thread"
puts "Message: $message"

该模式从日志条目中提取五个组件:错误级别、日期、时间、线程名称和消息。每个组件都用括号捕获并存储在单独的变量中。

使用开关

此示例组合了多个开关以实现更强大的匹配。

switches.tcl
set text "First line\nSecond line\nThird line"
set matches [regexp -all -inline -lineanchor {\w+ line} $text]
puts "Matches: $matches"

-all 开关查找所有匹配项,-inline 将它们作为列表返回,而 -lineanchor 使 ^ 和 $ 匹配行边界。该命令返回所有以 'line' 结尾的行。

最佳实践

本教程涵盖了 Tcl regexp 命令,并通过实际示例展示了模式匹配和文本提取技术。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Tcl 教程