|
|
|
| Здравствуйте.
Как определить числовой диапазон?
$str = 'name[num]'
num: 1-100
Спасибо | |
|
|
|
|
|
|
|
для: kostiaGt
(07.09.2009 в 15:26)
| | 1?\d{1,2}
включая 0 и 00 | |
|
|
|
|
|
|
|
для: heed
(07.09.2009 в 15:51)
| | как тут будет 20 например? | |
|
|
|
|
|
|
|
для: GeorgeIV
(07.09.2009 в 16:02)
| | если из коммандной строки запустить такой скрипт
# <?perl
use re qw(Debug ALL);
my $txt='20';
$txt =~ /^1?\d{1,2}$/;
|
то будет примерно так
C:\X_DOCS\src\PERL>perl test_RE.pl
Compiling REx "^1?\d{1,2}$"
Starting first pass (sizing)
>^1?\d{1,2}... | 1| reg
| | brnc
| | piec
| | atom
>1?\d{1,2}$< | 2| piec
| | atom
>\d{1,2}$< | 4| inst - CURLY
| 6| piec
| | atom
>$< | 7| inst - CURLY
| 9| piec
| | atom
Required size 10 nodes
Starting second pass (creation)
>^1?\d{1,2}... | 1| reg
| | brnc
| | piec
| | atom
>1?\d{1,2}$< | 2| piec
| | atom
>\d{1,2}$< | 4| inst - CURLY
| 6| tail~ BOL (1) -> CURLY
| | piec
| | atom
>$< | 7| inst - CURLY
| 9| tail~ CURLY {0,1} (2) -> CURLY
| | piec
| | atom
>< | 10| tail~ CURLY {1,2} (6) -> EOL
| 11| tail~ BOL (1)
| | ~ CURLY {0,1} (2)
| | ~ CURLY {1,2} (6)
| | ~ EOL (9) -> END
first:> 1: BOL (2)
first:> 2: CURLY {0,1} (6)
first at 2
Peep:Pos:0/0 Flags: 0x0 Whilem_c: 0 Lcp: 0 Last:'' 0:0/0 *Fixed:'' @ 0 Float: ''
.......................
немного сократил
.....................
Final program:
1: BOL (2)
2: CURLY {0,1} (6)
4: EXACT <1> (0)
6: CURLY {1,2} (9)
8: DIGIT (0)
9: EOL (10)
10: END (0)
floating ""$ at 1..3 (checking floating) anchored(BOL) minlen 1
r->extflags: ANCH_BOL USE_INTUIT_NOML USE_INTUIT_ML INTUIT_TAIL
Guessing start of match in sv for REx "^1?\d{1,2}$" against "20"
Check offset min: 1 Start shift: 1 End shift 0 Real End Shift: 0
fbm_instr len=1 str=<0>
Found floating substr ""$ at offset 2...
Check offset min:1 max:3 S:2 t:-1 D:-3 end:2
Guessed: match at offset 0
Matching REx "^1?\d{1,2}$" against "20"
Setting an EVAL scope, savestack=5
regmatch start
0 <> <20> | 1:BOL(2)
0 <> <20> | 2:CURLY {0,1}(6)
EXACT <1> can match 0 times out of 1...
Setting an EVAL scope, savestack=14
#0 CURLY_B_max
0 <> <20> | 6: CURLY {1,2}(9)
DIGIT can match 2 times out of 2...
Setting an EVAL scope, savestack=14
#1 CURLY_B_max
#0 CURLY_B_max
2 <20> <> | 9: EOL(10)
2 <20> <> | 10: END(0)
Match successful!
Freeing REx: "^1?\d{1,2}$"
|
но если чесно, я не очень разбираюсь в том что там пишут:)
//upd
интереснее что с строкой '1' внизу такой вывод
regmatch start
0 <> <1> | 1:BOL(2)
0 <> <1> | 2:CURLY {0,1}(6)
EXACT <1> can match 1 times out of 1...
Setting an EVAL scope, savestack=14
#0 CURLY_B_max
1 <1> <> | 6: CURLY {1,2}(9)
DIGIT can match 0 times out of 2...
failed...
1 <1> <> | pop CURLY_B_max
#0 CURLY_B_max
0 <> <1> | 6: CURLY {1,2}(9)
DIGIT can match 1 times out of 2...
Setting an EVAL scope, savestack=14
#1 CURLY_B_max
#0 CURLY_B_max
1 <1> <> | 9: EOL(10)
1 <1> <> | 10: END(0)
Match successful!
Freeing REx: "^1?\d{1,2}$"
|
| |
|
|
|
|
|
|
|
для: GeorgeIV
(07.09.2009 в 16:02)
| | а точно :) не подумал что будет с числом 199
тогда так:
(?:1(?=00))?\d{1,2}
// только это похоже медленнее
regmatch start
0 <> <1> | 1:BOL(2)
0 <> <1> | 2:CURLYM[0] {0,1}(14)
Setting an EVAL scope, savestack=14
#0 CURLYM_A yes
0 <> <1> | 4: EXACT <1>(6)
1 <1> <> | 6: IFMATCH[0](12)
#1 IFMATCH_A yes
#0 CURLYM_A yes
1 <1> <> | 8: EXACT <00>(10)
failed...
1 <1> <> | pop IFMATCH_A[Y]
failed...
0 <> <1> | pop CURLYM_A[Y]
CURLYM trying tail with matches=0...
#0 CURLYM_B
0 <> <1> | 14: CURLY {1,2}(17)
DIGIT can match 1 times out of 2...
Setting an EVAL scope, savestack=14
#1 CURLY_B_max
#0 CURLYM_B
1 <1> <> | 17: EOL(18)
1 <1> <> | 18: END(0)
Match successful!
| это с '1'
и получается что в таком случае если чётко определено начало числа
100|\d{1,2}
требует меньше времени | |
|
|
|