我有一个字符串(文件名):s_113_2.3gp
如何提取第二个下划线后出现的数字?在这种情况下它是'2
'但在某些情况下可以是几位数。
第一个下划线后出现的位数也可能不同,因此该String的长度不是恒定的。
答案 0 :(得分:6)
您可以使用捕获组:
preg_match('/_(\d+)\.\w+$/', $str, $matches);
$number = $matches[1];
\d+
代表1位或更多位数字。围绕它的括号捕获它,以便稍后可以使用$matches[1]
检索它。 .
需要进行转义,否则它会匹配任何字符,但会换行。 \w+
匹配1个或多个单词字符(数字,字母,下划线)。最后$
代表字符串的结尾并“锚定”正则表达式(否则你会遇到包含多个.
的字符串的问题。)
这也允许任意文件扩展名。
正如Ωmega在下面指出的,还有另一种可能性,即不使用捕获组。使用lookarounds的概念,您可以避免在开始时与_
匹配,在结尾时避免匹配\.\w+$
:
preg_match('/(?<=_)\d+(?=\.\w+$)/', $str, $matches);
$number = $matches[0];
但是,在应用这个相当小的优化之前,我会建议进行性能分析。但要记住这一点(或者更确切地说,阅读!)。
答案 1 :(得分:2)
使用正则表达式查找它是非常短的代码:
$n = preg_match('/(?<=_)\d+(?=\.)/', $str, $m) ? $m[0] : "";
...其中包含:找到一个或多个位于下划线\d+
和句点(?<=_)
之间的数字(?=\.)