Шаблон условного регулярного выражения для preg_match_all PHP

1

У меня есть образец. Всякий раз, когда конкретная группа соответствия отсутствует, она пропускает и находит другой совпадение, даже если она пропускает следующую группу соответствия.

Есть 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"
  }
}
  • 0
    Сделать первый квантификатор нежадным: + => +? , Для более эффективного шаблона вы также можете написать его так: regex101.com/r/zJ9rP2/1
  • 0
    Это & в классе символов допускается каждый из этих символов, а не сущность. например, & , a , m , p и ; ,
Показать ещё 1 комментарий
Теги:
preg-match-all

1 ответ

0
Лучший ответ

Попробуйте следующее: 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, поэтому они перемещали их из класса символов.

  • 0
    Спасибо! это то, что я ищу! Я новичок в регулярных выражениях. Спасибо за информацию также.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню