/ / Защо този php regex не съвпада с всички входове - php, regex

Защо този php regex не съвпада с всички входове - php, regex

Защо следващите regex: $regex = "/b(V|E)?d{1,2}? ?d{3} ?d{3}b/i"; не съответства на всички входни данни по-долу

Наистина мисля, че това (V|E)?d{1,2}? ? биха направили по избор буквите, първото едно или две номера и първото пространство

<?php

$sms = array(
"test test test 11 111 111 test test test",
"test test test 1 111 111 test test test",
"test test test 111 111 test test test", // does not match
"test test test test test test 11111111",
"test test test 1111111 test test test",
"test test test 111111 test test test", // does not match
"test test test E11 111 111 test test test",
"test test test V1 111 111 test test test",
"test test test V111 111 test test test", // does not match
"test test test V11111111 test test test",
"test test test V1111111 test test test",
"test test test E111111 test test test", // does not match
"test test test V 11 111 111 test test test",
"test test test V 1 111 111 test test test",
"test test test E 111 111 test test test", // does not match
"test test test V 11111111 test test test",
"test test test V 1111111 test test test",
"test test test V 111111 test test test", //does not match
"test test test V11 111 111 test test test",
"test test test V1 111 111 test test test",
"test test test E111 111 test test test", //does not match
"test test test V11111111 test test test",
"V1111111 test test test  test test test",
"test test test V111111 test test test", // does not match
);

$regex = "/b(V|E)?d{1,2}? ?d{3} ?d{3}b/i";
$noMatches = 0;
$index = 0;
foreach($sms as $v) {
$match = preg_match($regex, $v, $matches);



if($match) {
//print_r($matches);
//echo "$v match!n";
//$matches++;
}
else {
echo "$index - $v does NOT match!n";
$noMatches++;
}
$index++;
}
$total = count($sms);
echo "nnTotal: $totalnNo Matches: $noMatchesn";

OUTPUT

$ php test-regex.php
2 - test test test 111 111 test test test does NOT match!
5 - test test test 111111 test test test does NOT match!
8 - test test test V111 111 test test test does NOT match!
11 - test test test E111111 test test test does NOT match!
14 - test test test E 111 111 test test test does NOT match!
17 - test test test V 111111 test test test does NOT match!
20 - test test test E111 111 test test test does NOT match!
23 - test test test V111111 test test test does NOT match!


Total: 24
No Matches: 8

РЕДАКТИРАНЕ:

Използването на предложението на Марио сега е регекс $regex = "/b(V|E)?d{0,2} ?d{3} ?d{3}b/i";, защо в някои случаи това изречение не обхваща писмото V или E

$output = array(
"test test test E11 111 111 test test test" => "E11 111 111",
"test test test V1 111 111 test test test" => "V1 111 111",
"test test test V111 111 test test test" => "V111 111",
"test test test V11111111 test test test" => "V11111111",
"test test test V1111111 test test test" => "V1111111",
"test test test E111111 test test test" => "E111111",
"test test test V 11 111 111 test test test" => "11 111 111", // Missing Letter
"test test test V 1 111 111 test test test" => "1 111 111", // Missing Leter
"test test test E 111 111 test test test" => "E 111 111",
"test test test V 11111111 test test test" => "11111111", // Missing Letter
"test test test V 1111111 test test test" => "1111111", // Missing Letter
"test test test V 111111 test test test" => "V 111111",
"test test test V11 111 111 test test test" => "V11 111 111",
"test test test V1 111 111 test test test" => "V1 111 111",
"test test test E111 111 test test test" => "E111 111",
"test test test V11111111 test test test" => "V11111111",
"V1111111 test test test  test test test" => "V1111111",
"test test test V111111 test test test" => "V111111",
"V 1111111 test test test" => "1111111", // Missing Letter
"test test test V 1111111 test test test" => "1111111", // Missing Letter
);

Отговори:

2 за отговор № 1

? само е квантификатор след групи или буквални символи или класове символи, напр.

ако ? се появява след друг квантор * или + и {n,m} това просто ще направи съвпадението по-малко алчно. Това означава, че regex ще се опита да намери най-ниската сума.

Така d{1,2}? не означава незадължително. Това означава съвпадение на една или две, но предпочитат да съвпадат само с едно. Искаш да пишеш d{0,2} вместо.


1 за отговор № 2

Те не съвпадат, защото регулярният израз изисква най-малко 7 цифри:

/b(V|E)?d{1,2}? ?d{3} ?d{3}b/
|        |      |
|        |      -------->  3 digits exactly
|        --------------->  3 digits exactly
------------------------>  1 or 2 digits (prefers 1, but will match
2 if there are 8 digits in a row)

Всички отказали входове са с една цифра.


1 за отговор № 3

Ако искате да направите изцяло първата част, трябва да я поставите в скоби и да добавите a ? към това. Можете също да използвате група символи за V|E

(?:[VE]d{1,2} )?