2016-01-29 4 views
0

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

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

См demo

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

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

Благодаря

+0

Многократное группа будет улавливать только последнее вхождение. Это то, что вы хотите? –

+0

Какие квадратные скобки? Я не вижу квадратные скобки в вашем вопросе. Поместите текст и ваше 'regexp' в вопрос. Ссылка на внешний сайт для тестирования кода только в качестве вежливости с другими разработчиками, которые хотят вам помочь. Вопрос становится бесполезным, если удаленная ссылка исчезает или недоступна по какой-либо причине. – axiac

ответ

3

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

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

См regex demo

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

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

PHP demo:

$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]); 
+0

Обратите внимание, что регулярное выражение PCRE не поддерживает стек захвата для каждой группы захвата. Если вы устанавливаете квантификатор '+' или '*' в группу захвата, только последний захват будет сохранен в буфере памяти группы захвата. Это возможно в .NET, Python PyPi regex module и Boost, но не в PHP/PCRE. В PCRE, Oniguruma и других ароматах, поддерживающих оператор '\ G', мы можем использовать его для этой задачи. –

+0

Да, мне это нужно в PHP ... его жалуются на неизвестный модификатор –

+1

спасибо, что это сработало –

2

это хотите вы хотите?

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

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

EDIT (Full PHP Solution)

$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 
+0

Нет, каждое значение должно быть записано отдельно ... 8c .. Как и так далее. –

+0

@ElGabbu: Это только первый шаг для Двухэтапный подход, состоящий в извлечении полной подстроки с повторяющимися значениями, а затем разделить на доступные методы разделения строк. Ответ, безусловно, неполный. –

+0

Спасибо @ WiktorStribiżew Теперь я понял, что имел в виду ElGabbu. Я обновлю свой ответ – SERPRO