Regex повторять группу, игнорируя строки - PullRequest
0 голосов
/ 21 мая 2018

Я провел некоторое исследование, но в моем случае ничего не помогло.

У меня есть это регулярное выражение, где я могу получить поток № 0: 4, но я хотел бы повторить правило и также поймать поток № 0: 5.Как мне повторить правило и игнорировать в середине -> # 0: 0 (copy) -> # 0: 1 (copy)

регулярное выражение

/(?<=Stream mapping:)(\s+)([a-zA-Z])+(\s+)#([0-9]:[0-9])/s

текст

    Metadata:
      variant_bitrate : 800000
Stream mapping:
  Stream #0:4 -> #0:0 (copy)
  Stream #0:5 -> #0:1 (copy)
Press [q] to stop, [?] for help

Мой текущий результат

    array(1) { 
[0]=> array(5) 
  { 
  [0]=> string(15) " Stream #0:4" 
  [1]=> string(4) " " 
  [2]=> string(1) "m" 
  [3]=> string(1) " " 
  [4]=> string(3) "0:4" } 
  }

Другая проблема состоит в том, что мое регулярное выражение рассматривает «m» как отдельную комбинацию и включает пустые пробелы.Как мне это исправить?

Я хотел получить конечный результат, например

[0]Stream #0:4
[1]Stream #0:5

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Вы можете использовать пользовательскую границу слова на основе оператора \G:

$re = '/(?:\G(?!^)\s*|Stream mapping:\s*)\K([a-zA-Z]+\s+#[0-9]+:[0-9]+).*/';
$str = 'Metadata:
      variant_bitrate : 800000
Stream mapping:
  Stream #0:4 -> #0:0 (copy)
  Stream #0:5 -> #0:1 (copy)
Press [q] to stop, [?] for help';

if (preg_match_all($re, $str, $m)) {
 print_r($m[1]);
}

См. PHP демо .

Сведения о шаблоне:

  • (?:\G(?!^)\s*|Stream mapping:\s*) - либо конец предыдущего совпадения и 0+ пробельных символов, либо Stream mapping: подстрока, за которой следуют 0+ пробельных символов
  • \K - оператор сброса соответствия, отбрасывающий текущий сопоставленный текст
  • ([a-zA-Z]+\s+#[0-9]+:[0-9]+) - Группа 1: 1+ букв, 1+ пробелов, #, 1+ цифр, :, 1+ цифр
  • .* - любые 0+ символовдо конца строки (это необходимо использовать, поскольку нам нужны непрерывные совпадения)

См. regex demo .

0 голосов
/ 21 мая 2018

Почему бы не просто

/^  Stream #([\d:]+) -> #([\d:]+) \((.*)\)/gm

, который будет совпадать два раза,

  1. ['0:4', '0:0', 'copy'] и
  2. ['0:5', '0:1', 'copy']

Ваш взгляд на (?<=Stream mapping:) - вот что сломало ваш подход.Я не думаю, что это действительно нужно для этого ввода.

Обратите внимание, что с флагом m, ^ соответствует каждой строке, что полезно здесь.

...