Группа захвата Regex 2 для захвата того, что не соответствует группе захвата 1 - PullRequest
0 голосов
/ 05 февраля 2019

Я хочу захватить владельца или строителя в группе 1, в противном случае любой текст вплоть до дефиса и / или пробела, за которым следует цифра, встречается в группе 2, затем любая цифра до конца строки в группе 3 из следующего текста:-

PRD Hervey Bay 07 2525 1919
RG Sprake & Co Maryborough 4141 2424
Owner Robert - 0429 966 391
Owner Maureen - 07 8888 4444 - 0422000 111
Owner Wayne - 0430 555 666
Builder Scott - 0444 555 777

Выражение, которое я сейчас использую: -

/(Owner|Builder)([^-]+)-|\s+(\d.*)/gm

Не соответствует 'PRD Hervey Bay' и 'RG Sprake & Co Maryborough' в группе 2.

Любая помощь приветствуется!

Трент.

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете использовать это регулярное выражение для получения желаемых результатов:

/^(Owner |Builder )?(.*?)(?=-| \d)[- ]+(.*)$/m

Он ищет (необязательно) строку Owner или Builder;с последующим минимальным количеством символов до - или пробела, за которым следует цифра;за которым следует некоторое число - или пробел, затем символы до конца строки.Для использования в PHP:

$text = <<<EOD
PRD Hervey Bay 07 2525 1919
RG Sprake &amp; Co Maryborough 4141 2424
Owner Robert - 0429 966 391
Owner Maureen - 07 8888 4444 - 0422000 111
Owner Wayne - 0430 555 666
Builder Scott - 0444 555 777
EOD;
preg_match_all('/^(Owner |Builder )?(.*?)(?=-| \d)[- ]+(.*)$/m', $text, $matches);
print_r($matches);

Вывод:

Array ( 
  [0] => Array (
    [0] => PRD Hervey Bay 07 2525 1919
    [1] => RG Sprake &amp; Co Maryborough 4141 2424
    [2] => Owner Robert - 0429 966 391
    [3] => Owner Maureen - 07 8888 4444 - 0422000 111
    [4] => Owner Wayne - 0430 555 666
    [5] => Builder Scott - 0444 555 777 
    )
  [1] => Array (
    [0] => 
    [1] =>
    [2] => Owner
    [3] => Owner
    [4] => Owner
    [5] => Builder
    )
  [2] => Array (
    [0] => PRD Hervey Bay
    [1] => RG Sprake &amp; Co Maryborough
    [2] => Robert
    [3] => Maureen
    [4] => Wayne
    [5] => Scott
    )
  [3] => Array (
    [0] => 07 2525 1919
    [1] => 4141 2424
    [2] => 0429 966 391
    [3] => 07 8888 4444 - 0422000 111
    [4] => 0430 555 666
    [5] => 0444 555 777
    )
  )

Демонстрация на 3v4l.org

Обратите внимание, что это оставляет некоторые пробелы и- в последней группе вы можете легко удалить их (при желании), используя array_walk:

array_walk($matches[3], function (&$v) { $v = preg_replace('/[^\d]/', '', $v); });

Демонстрация на 3v4l.org

...