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]

これらは|(または) 演算子で区切られます。つまり、文字列が 3 つの部分のいずれかを満たす場合、一致は成功します。

さて、個々の部分に:

  1. [01]?[0-9][0-9]?これは、0 または 1 回の [01] (0 または 1)、次に任意の数字、そして任意の数字 (ある場合) に一致することを意味します。一緒に、これは199 以上の000文字列を受け入れます。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 に答える
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 に答える