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