如何使用PHP正则表达式提取字符串中@后无空格的数字?
解决@后提取数字(支持非数字前缀且无空格)的问题
我明白你的需求了——原来的正则只能匹配@直接跟数字的情况,但现在需要处理@后面先有非数字的非空格字符,再出现数字的场景,而且要求整个包含数字的@相关片段不能有空格。
调整正则表达式
核心思路是:先定位@,然后跳过它后面所有非空格、非数字的字符,再捕获连续数字,最后覆盖数字后面的非空格内容。推荐使用这个正则:
/@[^\s\d]*(\d+)[^\s]*/
各部分解释:
@:精准匹配@字符[^\s\d]*:匹配任意数量的非空格、非数字字符(比如字母、下划线等),跳过@后面的前缀内容(\d+):捕获一个或多个连续数字,这就是我们要提取的目标[^\s]*:匹配数字之后的任意非空格字符(比如字母、标点),确保整个片段没有空格
示例代码实现
如果你需要提取所有符合条件的数字,用preg_match_all;如果只需要第一个匹配结果,用preg_match即可:
提取所有匹配的数字
$s = '"access_token=103782364732640461|2. myemail@domain1.com ZmElnDTiZlkgXbT8e3 @DD234 4Jrw__.3600.1281891600-10000186237005'; $matches = array(); preg_match_all('/@[^\s\d]*(\d+)[^\s]*/', $s, $matches); // 提取到的数字存放在$matches[1]中 print_r($matches[1]); // 输出:Array ( [0] => 234 )
提取第一个匹配的数字
$s = 'This is a test <strong>@VVC345RR,</strong> text, and more text 12345'; $matches = array(); preg_match('/@[^\s\d]*(\d+)[^\s]*/', $s, $matches); echo $matches[1]; // 输出:345
额外说明
- 这个正则会自动忽略
@后面带空格的场景(比如@abc 123),因为[^\s]会在遇到空格时停止匹配,符合你“匹配部分不能包含空格”的要求 - 如果
@后面的无空格片段里没有数字,正则不会产生匹配结果,避免无效捕获
内容的提问来源于stack exchange,提问作者Juan Morales
相关产品推荐
相关产品推荐

