我想从这个字符串中提取所有数字:'s_0a1f2d4e3c10b'。该字符串必须遵循此模式's_NumberLetterNumberLetter ...' 我写了这个匹配整个字符串的正则表达式:
/^q_(?:\d+[a-f])+$/
问题是我不知道如何捕获数字。当我在\ d +周围放置括号时,正则表达式只匹配最后一个数字(10)。 这是带括号的正则表达式:
^q_(?:(\d+)[a-f])+$
当然我可以使用preg_match_all('/\d+/', 's_0a1f2d4e3c10b', $matches)
,但我希望字符串以's_'开头,我只想使用一个正则表达式(如果可能的话)。
答案 0 :(得分:1)
不确定您所追求的结果,因为您似乎想保留s_,但将数字(不是数字)分隔为值。它既可以是字符串,也可以是数字列表,而不是两者。
preg_match_all('/s_\d+|\d+/', 's_0a1f2d4e3c10b', $matches)
将返回一个数组,其中第一个值在开头保留s_
preg_match_all('/s_\d+|\d+/', 's_0a1f2d4e3c10b', $matches)
将返回一个数组,其第一个值为 s_
,然后后续值为数字。
您建议的preg_match_all('/\d+/', 's_0a1f2d4e3c10b', $matches)
将仅返回数组中的数字,如果将它们连接到字符串,则可以添加s_
前缀。
答案 1 :(得分:1)
有几种方法可以实现这一目标,但从本质上讲,这对于preg_split()来说是一个很好的工作:
如果符合条件的子字符串存在于较大的字符串中,那么在拆分为所需的输出数组之前,需要额外的步骤来提取符合条件的混合字符子字符串。
代码(Demo):
$in='This string s_0a1f2d4e3c10b is foo.';
$start=strpos($in,'s_')+2; // 14
$mixed=substr($in,$start,strpos($in,' ',$start)-$start); // 0a1f2d4e3c10b
$array=preg_split('/[^\d]+/',$mixed,null,PREG_SPLIT_NO_EMPTY);
// $array=['0','1','2','4','3','10']
*当然如果您想使用基于正则表达式的函数进行准备,您可以根据具体情况使用其中一个选项(Pattern Demo):
$mixed=preg_match('/s_\K[^ ]+/',$in,$out)?$out[0]:''; // 0a1f2d4e3c10b
或
$mixed=preg_match_all('/s_\K[^ ]+/',$in,$out)?$out[0][0]:''; // 0a1f2d4e3c10b
如果您只使用符合条件的字符串,则可以执行以下操作:
代码(Demo):
$in='s_0a1f2d4e3c10b';
$array=preg_split('/[^\d]+/',$in,null,PREG_SPLIT_NO_EMPTY);
var_export($array);
// $array=['0','1','2','4','3','10']
答案 2 :(得分:0)
您可以使用preg_replace,如下所示:
$count = null;
$returnValue = preg_replace('/[^0-9]+/', '', 's_0a1f2d4e3c10b', -1, $count);
这将删除字符串中的所有非数字字符。
$returnValue
将包含'0124310'
,$count
将包含7
(删除的字符数)