从正则捕获组提取值:基于给定正则与PHP判断实现指定输出
正则匹配与PHP捕获组提取实现方案
正则表达式解析
你选用的正则表达式 ^(?:([0-9]+) X,)?(?: )?(?:([0-9]+) Y,)?(?: Z)?$ 完全适配目标匹配场景,这里拆解下核心逻辑:
([0-9]+) X,:捕获组1,负责匹配「数字+X,」格式,外层的?:将其包装为可选非捕获组([0-9]+) Y,:捕获组2,同理匹配「数字+Y,」格式,同样设为可选(?: Z)?:匹配可选的, Z或Z后缀,不捕获该部分内容
PHP完整实现代码
结合你的输出需求,我把正则匹配和判断逻辑整合为可直接运行的代码,方便测试不同输入:
<?php // 准备所有测试输入案例 $testCases = [ '66 X, 55 Y, Z', '66 X, 55 Y,', '66 X, Z', '55 Y, Z', '66 X, 55 Y' ]; foreach ($testCases as $input) { $regex = '/^(?:([0-9]+) X,)?(?: )?(?:([0-9]+) Y,)?(?: Z)?$/'; preg_match($regex, $input, $matches); // 提取捕获组,不存在则返回null $group1 = isset($matches[1]) ? $matches[1] : 'null'; $group2 = isset($matches[2]) ? $matches[2] : 'null'; // 按指定格式输出 echo "输入内容: {$input}\n输出结果: {$group1} - {$group2}\n\n"; } ?>
测试运行结果
执行上述代码后,会得到如下输出:
输入内容: 66 X, 55 Y, Z 输出结果: 66 - 55 输入内容: 66 X, 55 Y, 输出结果: 66 - 55 输入内容: 66 X, Z 输出结果: 66 - null 输入内容: 55 Y, Z 输出结果: null - 55 输入内容: 66 X, 55 Y 输出结果: 66 - 55
小补充
如果需要严格限制X和Y部分之间必须有空格,可以把正则里的(?: )?替换为单个空格 ;如果要兼容无空格的情况(比如66 X,55 Y, Z),当前的正则已经可以覆盖。
内容的提问来源于stack exchange,提问作者Toleo
相关产品推荐
相关产品推荐

