理解tcl中的regexp

时间:2014-11-20 11:54:06

标签: regex tcl

我正在尝试使用正则表达式比较一个缓冲区值。

regexp {.*([0-9]+).*} $buffer match callID: $CallId

请您解释一下本声明中将要比较的内容。

1 个答案:

答案 0 :(得分:0)

在正则表达式中,$CallId不正确。我认为这是一个错字。你的正则表达式可能如下所示,

 regexp {.*([0-9]+).*} $buffer match callID

它将检查变量buffer中的模式。 regexp的基本语法如下,

  

regexp?开关? exp string?matchVar? ?subMatchVar subMatchVar ...?

变量match将保持整个模式,而变量callID将具有您给出的第一个子匹配。这只不过是该文本中匹配的数值。

子匹配只是括号内给出的表达式,每个子匹配输出将保存在regexp命令中给出的后续变量中。

此表达式可以显示如下

http://www.regexper.com/#.*(%5B0-9%5D%2B).*

.*将匹配任何内容并且它是贪婪的,这意味着它将尝试尽可能匹配。 (除非绝对必要,否则不建议)。

0-9将匹配0到9中的任何数字,+的使用将确保匹配0到9中的一个或多个数字值。(您还可以使用{{1} }这相当于0-9范围)

更新:

变量\d的内容是什么?当前正则表达式将匹配最后一次出现的数值。例如,假设缓冲区的内容可能类似于

buffer

如果应用给定的正则表达式,则输出可以如下,

set buffer "sometextherewithnumbers89sometext11211somemoretexthere891textstopshere"

输出

 puts [  regexp {.*([0-9]+).*} $buffer match callID ]; # Prints '1' since it matched

 puts $match; # Prints whole buffer content

 puts $callID; # Prints the number '9', since it is the last digit in the buffer

根据正则表达式,我们可以按以下方式将其分开

1
sometextherewithnumbers89sometext11211somemoretexthere789textstopshere
9

正如我先前所指出的那样,.* --- part 1 ([0-9]+) --- part 2 .* --- part 3 是一个贪婪的,它会尽可能地匹配。因此,开头的.*.*匹配。然后sometextherewithnumbers89sometext11211somemoretexthere78将匹配最后一位([0-9]+)。最后,9将匹配剩余的文字.*

查看here以查看给定示例的匹配模式。