2013-08-29 56 views
2

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

任何人請解釋一下這些是如何執行的?我正在努力去理解。

回答

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 
+0

更好的鏈接應該是http://www.tcl.tk/man/tcl8.6/TclCmd/re_syntax.htm(它是Tcl的等效資源),儘管RE語言在子集上是相同的在問題中使用。 –

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]

它們與|(或)運算符分開的,這意味着,如果該字符串滿足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

由於沒有什麼更多的,只有數字從000255將在驗證成功。

這就是爲什麼9,64和255通過,但不能256或1000

0

它匹配到以下號碼

[01]?[0-9][0-9]? -> 0 - 9, 00 - 99, 000 - 199 
2[0-4][0-9]  -> 200 - 249 
25[0-5]   -> 250 - 255 
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