Regex повторная группа

Возникли проблемы с группой повторного захвата:

(?:\[)(?:(?:\s*?)([2-9AQTKJ][shcd])+?(?:\s*?)).*?(?:\])

Увидеть демонстрация

В основном я хочу соответствовать значению карты (As, 8h и т. д.) комбинации только в квадратных скобках

Любая помощь будет принята с благодарностью.

Спасибо

0

Решение

Вы можете использовать регулярное выражение с \G оператор для сопоставления нескольких подстрок внутри [...]:

(?:\[|(?!^)\G)\s*\K[2-9AQTKJ][shcd](?=[^\]]*])

Увидеть regex demo

Короче говоря, это регулярное выражение PCRE будет соответствовать тексту, который:

  • (?:\[|(?!^)\G)\s*\K — начинается с [ или в конце предыдущего успешного совпадения, за которым следуют ноль или более пробельных символов
  • [2-9AQTKJ][shcd] — соответствует 2 символам каждый из определенных наборов
  • (?=[^\]]*]) — положительная проверка, если есть закрытие ] впереди текущей позиции

PHP демо:

$re = '~(?:\[|(?!^)\G)\s*\K[2-9AQTKJ][shcd](?=[^\]]*])~';
$str = "[As 4h 8s] [ As 4h ] [As4h] As [ 4h ";
preg_match_all($re, $str, $matches);
print_r($matches[0]);
3

Другие решения

Вы этого хотите?

/\[([^\]]+)\]/

https://regex101.com/r/vT8aC8/2

РЕДАКТИРОВАТЬ (Полное решение PHP)

$str= "[As 4h 8s] [ As 4h ] [As4h] As [ 4h ";

preg_match_all("/\[([^\]]+)\]/", $str, $matches);
$values = $matches[1];
$result = [];
foreach($values as $value)
{
$parts = preg_split("/ /", $value, -1, PREG_SPLIT_NO_EMPTY);
foreach($parts as $part)
{
array_push($result, $part);
}
}
var_dump($result); // $result will contain all the values you want
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector