Tcl 正则表达式



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

序号 规则及描述
1

x

精确匹配。

2

[a-z]

任何小写字母 a-z。

3

.

任何字符。

4

^

字符串开头应匹配。

5

$

字符串结尾应匹配。

6

\^

反斜杠序列,用于匹配特殊字符 ^。同样,您可以对其他字符使用。

7

()

将上述序列放在括号内以构成正则表达式。

8

x*

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

9

x+

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

10

[a-z]?

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

11

{digit}

匹配前面正则表达式的精确 digit 次出现。digit 包含 0-9。

12

{digit,}

匹配前面正则表达式的 3 次或更多 digit 次出现。digit 包含 0-9。

13

{digit1,digit2}

匹配次数在前面正则表达式 digit1 和 digit2 次出现之间。

语法

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

regexp optionalSwitches patterns searchString fullMatch subMatch1 ... subMatchn

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

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

#!/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
广告