У меня есть образец. Всякий раз, когда конкретная группа соответствия отсутствует, она пропускает и находит другой совпадение, даже если она пропускает следующую группу соответствия.
Есть 4 группы захвата.
первая группа, 2-я группа, 3-я группа, 4-я группа
Третья группа не всегда существует. В моей примерной строке есть 3 набора. Первый не содержит символов для третьей группы. Я хочу условное утверждение для третьей группы. Если он не нашел какого-либо символа, он должен запечатлеть пробел или пробел.
Демо: https://regex101.com/r/zK0aW4/1
это должно быть так: https://regex101.com/r/sD4eB7/1
но я не знаю, как назначить условие для этого.
Если третьего матча нет, значит, он должен быть пустым. Как написать это в шаблоне регулярных выражений?
Например:
$string = "\nTHIS IS FIRST PATTERN 63101 0789158126 0-0000000-000-0000\n4415 THIS IS FIRST \nPATTERN 49401-9528\n0406842931 Third match 0-0000000-000-0000\n11403 THIS IS FIRST PATTERN 49401-\n9595\n0112853789 Third match 0-0000000-000-0000";
preg_match_all(
"/([A-Z ,\.\-\&#\\\\n\/0-9&]+)(\d{10})([A-Z a-z]+)(\d{1}-\d{7}-\d{3}-\d{4}|\d{1}-\d{7}-\d{2}-\d{4})/",
$string,
$matches
);
Это должно выводить что-то вроде:
array(3) {
[0]=>
array(3) {
[0]=>
string(78) "\nTHIS IS FIRST PATTERN 63101 0789158126 0-0000000-000-0000"
[1]=>
string(84) "\n4415 THIS IS FIRST \nPATTERN 49401-9528\n0406842931 Third match 0-0000000-000-0000"
[2]=>
string(87) "\n11403 THIS IS FIRST PATTERN 49401-\n9595\n0112853789 Third match 0-0000000-000-0000"
}
[1]=>
array(5) {
[0]=>
string(36) "\nTHIS IS FIRST PATTERN 63101"
[1]=>
string(42) "\n4415 THIS IS FIRST \nPATTERN 49401-9528\n"
[2]=>
string(45) "\n11403 THIS IS FIRST PATTERN 49401-\n9595\n"
}
[2]=>
array(3) {
[0]=>
string(10) "0789158126"
[1]=>
string(10) "0406842931"
[2]=>
string(10) "0112853789"
}
[3]=>
array(3) {
[0]=>
string(15) " "
[1]=>
string(15) " Third match "
[2]=>
string(15) " Third match "
}
[4]=>
array(3) {
[0]=>
string(17) "0-0000000-000-0000"
[1]=>
string(17) "0-0000000-000-0000"
[2]=>
string(17) "0-0000000-000-0000"
}
}
Попробуйте следующее: https://regex101.com/r/zK0aW4/2
((?:[A-Z ,.&#\/0-9-]|&|\\n)+?)(\d{10})([A-Z a-z]+)?(\d{1}-\d{7}-\d{3}-\d{4}|\d{1}-\d{7}-\d{2}-\d{4})
Поскольку ваша начальная группа имеет так много совпадений, она слишком далеко продвигается. Перейдя на не-жадный или ленивый матч (*?
Или +?
), Он будет соответствовать как можно меньше. Это заставляет его вести себя лучше со следующими шаблонами.
Классы символов (в окружении [
и ]
) предназначены для сопоставления одиночных символов; Я предположил, что вы хотите сопоставить только литерал &
и \n
, поэтому они перемещали их из класса символов.
+
=>+?
, Для более эффективного шаблона вы также можете написать его так: regex101.com/r/zJ9rP2/1&
в классе символов допускается каждый из этих символов, а не сущность. например,&
,a
,m
,p
и;
,