仅捕获以“s_”开头的字符串中的数字

时间:2017-06-13 23:20:40

标签: php regex

我想从这个字符串中提取所有数字:'s_0a1f2d4e3c10b'。该字符串必须遵循此模式's_NumberLetterNumberLetter ...' 我写了这个匹配整个字符串的正则表达式:

/^q_(?:\d+[a-f])+$/

问题是我不知道如何捕获数字。当我在\ d +周围放置括号时,正则表达式只匹配最后一个数字(10)。 这是带括号的正则表达式:

^q_(?:(\d+)[a-f])+$

当然我可以使用preg_match_all('/\d+/', 's_0a1f2d4e3c10b', $matches),但我希望字符串以's_'开头,我只想使用一个正则表达式(如果可能的话)。

3 个答案:

答案 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(删除的字符数)