Nicht-erfassende Klammern in PHP Regex

Klammern () erfüllen zwei Funktionen - das Gruppieren von Zeichen und die Erfassungsgruppen-Funktion. Aber was tun, wenn wir gruppieren möchten, aber nicht in der Erfassungsgruppe speichern wollen? Für die Lösung dieses Problems wurden spezielle nicht-erfassende Klammern (?: ) erfunden - sie gruppieren, speichern aber nicht in der Erfassungsgruppe.

Beispiel

Im folgenden Beispiel benötigen wir die ersten Klammern für die Gruppierung und die zweiten - für die Erfassungsgruppe. Allerdings speichern beide Klammern Daten in der Erfassungsgruppe:

php<?php
  $str = 'abab123';
  $reg = '#(ab)+([1-9]+)#';
  preg_match_all($reg, $str, $res);
?>

Als Ergebnis werden wir folgendes in unseren Erfassungsgruppen haben:

php<?php
  var_dump($res[0]); // gibt 'abab123' aus
  var_dump($res[1]); // gibt 'ab' aus
  var_dump($res[2]); // gibt '123' aus
?>

Beispiel

Lassen Sie uns die ersten Klammern so ändern, dass sie nur gruppieren, aber nicht in der Erfassungsgruppe speichern:

php<?php
  $str = 'abab123';
  $reg = '#(?:ab)+([1-9]+)#';
  preg_match_all($reg, $str, $res);
?>

Als Ergebnis wird unsere Zahl in der ersten Erfassungsgruppe sein:

php<?php
  var_dump($res[1]); // gibt '123' aus
?>

Praktische Aufgaben

Задание 1

Es gibt Teilzeichenketten, die in zwei Teile geteilt sind durch eine beliebige Anzahl von $@ Paaren:

php<?php
  $str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>

Finden Sie jede dieser Teilzeichenketten und speichern Sie für jede gefundene Teilzeichenkette in der ersten Erfassungsgruppe den Teil vor dem Trennzeichen und in der zweiten Erfassungsgruppe - den Teil nach dem Trennzeichen.