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