任何人都可以帮助我"执行流程" 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)
任何人都可以解释一下这些是如何执行的吗?我很难理解。
答案 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个部分中的任何一个,则匹配成功。
现在,对各个部分:
[01]?[0-9][0-9]?
这意味着它匹配0或1次[01](0或1),然后是任何数字,再次是任何数字,如果有的话。同时,这会接受000
或199
之类的字符串,但不会超过199。
2[0-4][0-9]
这遵循与上面相同的逻辑,除了它验证数字从200到249的字符串。
25[0-5]
最后,这个会验证数字从250到255的字符串。
由于没有其他内容,只有000
到255
的数字才能在验证中成功。
这就是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