2

任何人都可以帮助我在 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

4 回答 4

6

正则表达式首先有锚点^$主要捕获组周围,这里用括号表示,([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]

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

现在,到各个部分:

  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 的字符串。

由于没有更多内容,因此只有从000到的数字255才能成功验证。

这就是为什么通过了 9、64 和 255,但没有通过 256 或 1000。

于 2013-08-29T13:00:00.293 回答
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
于 2013-08-29T18:41:44.953 回答
1

Everything is detailled in 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
于 2013-08-29T12:53:53.160 回答
0

它与以下数字匹配

[01]?[0-9][0-9]? -> 0 - 9, 00 - 99, 000 - 199
2[0-4][0-9]      -> 200 - 249
25[0-5]          -> 250 - 255   
于 2013-08-29T13:00:14.530 回答