正则表达式重复组


Regex repeated group

重复捕获组时遇到问题:

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

查看演示

基本上我只想在方括号内匹配卡值(As8h等)组合

任何帮助将不胜感激。

谢谢

您可以使用带有'G运算符的正则表达式来匹配[...]中的多个子字符串:

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

查看正则表达式演示

简而言之,此 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]);

这是你想要的吗?

/'[([^']]+)']/

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