Tcl - 正则表达式

"regexp"命令用于匹配 Tcl 中的正则表达式。 正则表达式是包含搜索模式的字符序列。 它由多个规则组成,下表解释了这些规则及其相应的用途。

序号 规则和说明
1

x

完全匹配。

2

[a-z]

a-z 中的任何小写字母。

3

.

任何字符。

4

^

开始字符串应该匹配。

5

$

结束字符串应该匹配。

6

\^

用于匹配特殊字符 ^ 的反斜杠序列。类似地,您可以用于其他字符。

7

()

将上述序列添加到括号内以形成正则表达式。

8

x*

应匹配 0 次或多次出现的前面的 x。

9

x+

应匹配前面的 x 的 1 次或多次出现。

10

[a-z]?

应匹配前面的 x 的 0 或 1 次出现。

11

{digit}

精确匹配先前正则表达式中出现的数字。 包含0-9的数字。

12

{digit,}

匹配先前正则表达式中出现的 3 个或更多数字。 包含0-9的数字。

13

{digit1,digit2}

出现次数与先前正则表达式的数字 1 和数字 2 出现次数之间的范围相匹配。

语法

正则表达式的语法如下所示 −

regexp optionalSwitches patterns searchString fullMatch subMatch1 ... subMatchn

这里,regex 是命令。 稍后我们将看到可选开关。 模式就是前面提到的规则。 搜索字符串是执行正则表达式的实际字符串。 完全匹配是保存匹配正则表达式结果的任何变量。 Submatch1 到 SubMatchn 是可选的 subMatch 变量,用于保存子匹配模式的结果。

在深入研究复杂的示例之前,让我们先看一些简单的示例。 带有任意字母的字符串的简单示例。 当正则表达式遇到任何其他字符时,搜索将停止并返回。

#!/usr/bin/tclsh

regexp {([A-Za-z]*)} "Tcl Tutorial" a b 
puts "Full Match: $a"
puts "Sub Match1: $b"

执行上述代码时,会产生以下结果 −

Full Match: Tcl
Sub Match1: Tcl

多种模式

以下示例演示如何搜索多个模式。 这是任何字母表后跟任何字符后跟任何字母表的示例模式。

#!/usr/bin/tclsh

regexp {([A-Za-z]*).([A-Za-z]*)} "Tcl Tutorial" a b c  
puts "Full Match: $a"
puts "Sub Match1: $b"
puts "Sub Match2: $c"

执行上述代码时,会产生以下结果 −

Full Match: Tcl Tutorial
Sub Match1: Tcl
Sub Match2: Tutorial

上述代码的修改版本显示子模式可以包含多个模式,如下所示 −

#!/usr/bin/tclsh

regexp {([A-Za-z]*.([A-Za-z]*))} "Tcl Tutorial" a b c  
puts "Full Match: $a"
puts "Sub Match1: $b"
puts "Sub Match2: $c"

执行上述代码时,会产生以下结果 −

Full Match: Tcl Tutorial
Sub Match1: Tcl Tutorial
Sub Match2: Tutorial

正则表达式命令开关

Tcl 中可用的开关列表是,

  • nocase − 用于忽略大小写。

  • indices − 存储匹配子模式的位置而不是匹配字符。

  • line − 新行敏感匹配。 忽略换行符后的字符。

  • start index − 设置搜索模式开始的偏移量。

  • 标记开关结束

在上面的例子中,我特意对所有字母使用了 [A-Z, a-z],你可以轻松地使用 -nocase 而不是如下所示 −

#!/usr/bin/tclsh

regexp -nocase {([A-Z]*.([A-Z]*))} "Tcl Tutorial" a b c  
puts "Full Match: $a"
puts "Sub Match1: $b"
puts "Sub Match2: $c"

执行上述代码时,会产生以下结果 −

Full Match: Tcl Tutorial
Sub Match1: Tcl Tutorial
Sub Match2: Tutorial

使用开关的另一个示例如下所示 −

#!/usr/bin/tclsh

regexp -nocase -line -- {([A-Z]*.([A-Z]*))} "Tcl \nTutorial" a b 
puts "Full Match: $a"
puts "Sub Match1: $b"
regexp -nocase -start 4 -line -- {([A-Z]*.([A-Z]*))} "Tcl \nTutorial" a b  
puts "Full Match: $a"
puts "Sub Match1: $b"

执行上述代码时,会产生以下结果 −

Full Match: Tcl 
Sub Match1: Tcl 
Full Match: Tutorial
Sub Match1: Tutorial