PHP 정규식의 비캡처 그룹

괄호 ()는 두 가지 기능을 수행합니다 - 문자 그룹화와 캡처 그룹 기능입니다. 그런데 그룹화는 필요하지만 캡처는 하고 싶지 않다면 어떻게 해야 할까요? 이러한 문제를 해결하기 위해 특별한 비캡처 그룹 (?: )이 만들어졌습니다. 이것은 그룹화는 하지만 캡처하지 않습니다.

예시

다음 예시에서 첫 번째 괄호는 그룹화를 위해 필요하고, 두 번째 괄호는 캡처를 위해 필요합니다. 그러나 두 괄호 모두 데이터를 캡처합니다:

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

결과적으로 우리의 캡처 그룹에는 다음과 같은 데이터가 담기게 됩니다:

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

예시

첫 번째 괄호 쌍이 그룹화만 하고 캡처하지 않도록 만들어 봅시다:

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

결과적으로 첫 번째 캡처 그룹에는 우리의 숫자가 담기게 됩니다:

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

실습 문제

Задание 1

임의의 수의 $@ 쌍으로 두 부분으로 나뉜 부분 문자열이 주어집니다:

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

각각의 이러한 부분 문자열을 찾고, 발견된 각 부분 문자열에 대해 구분자 앞에 있는 것을 첫 번째 캡처 그룹에, 구분자 뒤에 있는 것을 두 번째 캡처 그룹에 넣으세요.