我试过
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。
有人可以告诉我原因吗?
答案 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。