tcl中[0-9]和\ d之间的差异

时间:2014-12-22 09:38:40

标签: regex tcl

我试过

puts [regexp "(\[0-9]{1,3})\.(\[0-9]{1,3})\.(\[0-9]{1,3})\.(\[0-9]{1,3})" 192.168.1.10]

答案是1。

但如果我使用

puts [regexp "(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})" 192.168.1.10]

(将\[0-9]替换为\d)答案为0。

有人可以告诉我原因吗?

2 个答案:

答案 0 :(得分:5)

当使用双引号时,您应该将\d中的反斜杠转义为\\d

puts [regexp "(\\d{1,3})\.(\\d{1,3})\.(\\d{1,3})\.(\\d{1,3})" 192.168.1.10]

或者你必须使用大括号。

puts [regexp {(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})} 192.168.1.10]

注意:使用大括号,变量替换不会发生。

答案 1 :(得分:3)

这里的问题并不是\d[0-9]之间的区别,而是你在正则表达式中处理这两个表达式的方式。在Tcl中,双引号允许第一级替换。只有当该替换级别完成时,结果才会传递给regexp函数。

因此,使用该视图,在两种情况下实际传递给regexp函数的是:

([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})

(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})

这显然与您提供的字符串不匹配。然而,像dd.ddaddfdd这样的东西(记住.匹配任何单个字符!)。

请记住,反斜杠 在Tcl中替换,就像$[ ... ]一样(即,在没有大括号的情况下提供字符串时)。要获得文字反斜杠,您可以(使用当前格式):

([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})

(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})

或者为了避免这样做的痛苦,请使用大括号:

regexp {([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})} 192.168.1.10

regexp {(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})} 192.168.1.10

我在这里提到的另一件事是,如果你不使用它们进行分组,你不需要括号进行验证,所以这应该足以提高你的脚本的速度:

regexp {[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}} 192.168.1.10

如果您想要标题的答案, \d[0-9]之间的差异。 stackoverflow上最受欢迎的问题来自C#,但这也适用于Tcl this one,这表明\d匹配的数字远远超过数字0到9。