需要有关TCL中正则表达式的帮助

时间:2013-08-29 12:48:24

标签: regex tcl

任何人都可以帮助我"执行流程" TCL中的以下正则表达式。

% regexp {^([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])$} 9
1 (success)
%
%
% regexp {^([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])$} 64
1 (success)
% regexp {^([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])$} 255
1 (success)
% regexp {^([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])$} 256
0 (Fail)
% regexp {^([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])$} 1000
0 (Fail)

任何人都可以解释一下这些是如何执行的吗?我很难理解。

4 个答案:

答案 0 :(得分:6)

regexp首先在主要捕获组周围有锚点^$,括号括号([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])表示它正在检查整个字符串。

其次,在捕获组内部,我们有3个部分:

[01]?[0-9][0-9]?

2[0-4][0-9]

25[0-5]

它们用|(或)运算符分隔,这意味着如果字符串满足3个部分中的任何一个,则匹配成功。

现在,对各个部分:

  1. [01]?[0-9][0-9]?这意味着它匹配0或1次[01](0或1),然后是任何数字,再次是任何数字,如果有的话。同时,这会接受000199之类的字符串,但不会超过199。

  2. 2[0-4][0-9]这遵循与上面相同的逻辑,除了它验证数字从200到249的字符串。

  3. 25[0-5]最后,这个会验证数字从250到255的字符串。

  4. 由于没有其他内容,只有000255的数字才能在验证中成功。

    这就是9,64和255通过的原因,但不是256或1000。

答案 1 :(得分:2)

不是问题的答案,只是探索其他方法来进行验证:

proc from_0_to_255 {n} {
    expr {[string is integer -strict $n] && 0 <= $n && $n <= 255}
}
from_0_to_255 256          ; # => 0
proc int_in_range {n {from 0} {to 255}} {
    expr {[string is integer -strict $n] && $from <= $n && $n <= $to}
}
int_in_range 256           ; # => 0
int_in_range 256  0 1024   ; # => 1
proc int_in_range {n args} {
    array set range [list -from 0 -to 255 {*}$args]
    expr {
        [string is integer -strict $n] &&
        $range(-from) <= $n && $n <= $range(-to)
    }
}
int_in_range 256           ; # => 0
int_in_range 256 -to 1024  ; # => 1

答案 2 :(得分:1)

http://perldoc.perl.org/perlre.html#Regular-Expressions中详细说明了所有内容。

^        Match the beginning of the line
$        Match the end of the line (or before newline at the end)
?        Match 1 or 0 times
|        Alternation
()       Grouping
[]       Bracketed Character class

答案 3 :(得分:0)

它符合以下数字

[01]?[0-9][0-9]? -> 0 - 9, 00 - 99, 000 - 199
2[0-4][0-9]      -> 200 - 249
25[0-5]          -> 250 - 255