正则表达式匹配1-255之间的正整数

时间:2023-01-29 05:51:53
我真是醉了,正则真是个麻烦的玩意:
$str = '1232';
if(preg_match('/^[01][0-9]{1,2}|2[0-4][0-9]|25[0-5]$/', $str)){
echo "true";
}else{
echo "false";
}

为什么上面的正则会返回true?
还有,求正则表达式:匹配1-255之间的正整数。 正则表达式匹配1-255之间的正整数

3 个解决方案

#1


[012][0-9][0-9]

#2


$p = '/^(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[1-9])$/';
for($i=1; $i<=260; $i++)
  printf("%4d %d\n", $i, preg_match($p, $i));
   1 1
   2 1
   3 1
   4 1
   5 1
   6 1
   7 1
   8 1
   9 1
  10 1
  11 1
  12 1
  13 1
  14 1
  15 1
  16 1
  17 1
  18 1
  19 1
  20 1
  21 1
  22 1
  23 1
  24 1
  25 1
  26 1
  27 1
  28 1
  29 1
  30 1
  31 1
  32 1
  33 1
  34 1
  35 1
  36 1
  37 1
  38 1
  39 1
  40 1
  41 1
  42 1
  43 1
  44 1
  45 1
  46 1
  47 1
  48 1
  49 1
  50 1
  51 1
  52 1
  53 1
  54 1
  55 1
  56 1
  57 1
  58 1
  59 1
  60 1
  61 1
  62 1
  63 1
  64 1
  65 1
  66 1
  67 1
  68 1
  69 1
  70 1
  71 1
  72 1
  73 1
  74 1
  75 1
  76 1
  77 1
  78 1
  79 1
  80 1
  81 1
  82 1
  83 1
  84 1
  85 1
  86 1
  87 1
  88 1
  89 1
  90 1
  91 1
  92 1
  93 1
  94 1
  95 1
  96 1
  97 1
  98 1
  99 1
 100 1
 101 1
 102 1
 103 1
 104 1
 105 1
 106 1
 107 1
 108 1
 109 1
 110 1
 111 1
 112 1
 113 1
 114 1
 115 1
 116 1
 117 1
 118 1
 119 1
 120 1
 121 1
 122 1
 123 1
 124 1
 125 1
 126 1
 127 1
 128 1
 129 1
 130 1
 131 1
 132 1
 133 1
 134 1
 135 1
 136 1
 137 1
 138 1
 139 1
 140 1
 141 1
 142 1
 143 1
 144 1
 145 1
 146 1
 147 1
 148 1
 149 1
 150 1
 151 1
 152 1
 153 1
 154 1
 155 1
 156 1
 157 1
 158 1
 159 1
 160 1
 161 1
 162 1
 163 1
 164 1
 165 1
 166 1
 167 1
 168 1
 169 1
 170 1
 171 1
 172 1
 173 1
 174 1
 175 1
 176 1
 177 1
 178 1
 179 1
 180 1
 181 1
 182 1
 183 1
 184 1
 185 1
 186 1
 187 1
 188 1
 189 1
 190 1
 191 1
 192 1
 193 1
 194 1
 195 1
 196 1
 197 1
 198 1
 199 1
 200 1
 201 1
 202 1
 203 1
 204 1
 205 1
 206 1
 207 1
 208 1
 209 1
 210 1
 211 1
 212 1
 213 1
 214 1
 215 1
 216 1
 217 1
 218 1
 219 1
 220 1
 221 1
 222 1
 223 1
 224 1
 225 1
 226 1
 227 1
 228 1
 229 1
 230 1
 231 1
 232 1
 233 1
 234 1
 235 1
 236 1
 237 1
 238 1
 239 1
 240 1
 241 1
 242 1
 243 1
 244 1
 245 1
 246 1
 247 1
 248 1
 249 1
 250 1
 251 1
 252 1
 253 1
 254 1
 255 1
 256 0
 257 0
 258 0
 259 0
 260 0

#3


2楼大体上是对的,但是没有加上单词分隔符
测试数据:
11 123 301 9 10 31 30 33
匹配出:
11
123
30
1
9
10
31
30
33
可见这与预期不符,因为该正则把301拆成30与1了
正确如下:
\b25[0-5]\b|\b2[0-4]\d\b|\b1\d\d\b|\b[1-9]\d\b|\b[1-9]\b

#1


[012][0-9][0-9]

#2


$p = '/^(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[1-9])$/';
for($i=1; $i<=260; $i++)
  printf("%4d %d\n", $i, preg_match($p, $i));
   1 1
   2 1
   3 1
   4 1
   5 1
   6 1
   7 1
   8 1
   9 1
  10 1
  11 1
  12 1
  13 1
  14 1
  15 1
  16 1
  17 1
  18 1
  19 1
  20 1
  21 1
  22 1
  23 1
  24 1
  25 1
  26 1
  27 1
  28 1
  29 1
  30 1
  31 1
  32 1
  33 1
  34 1
  35 1
  36 1
  37 1
  38 1
  39 1
  40 1
  41 1
  42 1
  43 1
  44 1
  45 1
  46 1
  47 1
  48 1
  49 1
  50 1
  51 1
  52 1
  53 1
  54 1
  55 1
  56 1
  57 1
  58 1
  59 1
  60 1
  61 1
  62 1
  63 1
  64 1
  65 1
  66 1
  67 1
  68 1
  69 1
  70 1
  71 1
  72 1
  73 1
  74 1
  75 1
  76 1
  77 1
  78 1
  79 1
  80 1
  81 1
  82 1
  83 1
  84 1
  85 1
  86 1
  87 1
  88 1
  89 1
  90 1
  91 1
  92 1
  93 1
  94 1
  95 1
  96 1
  97 1
  98 1
  99 1
 100 1
 101 1
 102 1
 103 1
 104 1
 105 1
 106 1
 107 1
 108 1
 109 1
 110 1
 111 1
 112 1
 113 1
 114 1
 115 1
 116 1
 117 1
 118 1
 119 1
 120 1
 121 1
 122 1
 123 1
 124 1
 125 1
 126 1
 127 1
 128 1
 129 1
 130 1
 131 1
 132 1
 133 1
 134 1
 135 1
 136 1
 137 1
 138 1
 139 1
 140 1
 141 1
 142 1
 143 1
 144 1
 145 1
 146 1
 147 1
 148 1
 149 1
 150 1
 151 1
 152 1
 153 1
 154 1
 155 1
 156 1
 157 1
 158 1
 159 1
 160 1
 161 1
 162 1
 163 1
 164 1
 165 1
 166 1
 167 1
 168 1
 169 1
 170 1
 171 1
 172 1
 173 1
 174 1
 175 1
 176 1
 177 1
 178 1
 179 1
 180 1
 181 1
 182 1
 183 1
 184 1
 185 1
 186 1
 187 1
 188 1
 189 1
 190 1
 191 1
 192 1
 193 1
 194 1
 195 1
 196 1
 197 1
 198 1
 199 1
 200 1
 201 1
 202 1
 203 1
 204 1
 205 1
 206 1
 207 1
 208 1
 209 1
 210 1
 211 1
 212 1
 213 1
 214 1
 215 1
 216 1
 217 1
 218 1
 219 1
 220 1
 221 1
 222 1
 223 1
 224 1
 225 1
 226 1
 227 1
 228 1
 229 1
 230 1
 231 1
 232 1
 233 1
 234 1
 235 1
 236 1
 237 1
 238 1
 239 1
 240 1
 241 1
 242 1
 243 1
 244 1
 245 1
 246 1
 247 1
 248 1
 249 1
 250 1
 251 1
 252 1
 253 1
 254 1
 255 1
 256 0
 257 0
 258 0
 259 0
 260 0

#3


2楼大体上是对的,但是没有加上单词分隔符
测试数据:
11 123 301 9 10 31 30 33
匹配出:
11
123
30
1
9
10
31
30
33
可见这与预期不符,因为该正则把301拆成30与1了
正确如下:
\b25[0-5]\b|\b2[0-4]\d\b|\b1\d\d\b|\b[1-9]\d\b|\b[1-9]\b