Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как определить числовой диапазон?
 
 автор: kostiaGt   (07.09.2009 в 15:26)   письмо автору
 
 

Здравствуйте.

Как определить числовой диапазон?
$str = 'name[num]'
num: 1-100
Спасибо

  Ответить  
 
 автор: heed   (07.09.2009 в 15:51)   письмо автору
 
   для: kostiaGt   (07.09.2009 в 15:26)
 

1?\d{1,2}

включая 0 и 00

  Ответить  
 
 автор: GeorgeIV   (07.09.2009 в 16:02)   письмо автору
 
   для: heed   (07.09.2009 в 15:51)
 

как тут будет 20 например?

  Ответить  
 
 автор: heed   (07.09.2009 в 16:38)   письмо автору
 
   для: 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}$"

  Ответить  
 
 автор: heed   (07.09.2009 в 17:08)   письмо автору
 
   для: 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}
требует меньше времени

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования