You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求匹配末尾为X、长度至多5的最长子串的正则表达式(PHP)

PHP正则匹配最长的至多5字符且结尾为X的子串

问题分析

你原来的正则/^(.{4})X.+$/只能匹配X恰好处于第5位且后面还有字符的场景,无法覆盖所有情况,也没法找到最长的符合要求的子串。我们需要的是优先匹配长度最大(最多5个字符)、以X结尾的子串,同时覆盖所有可能的位置。

解决方案

这里提供两种实用的实现方式:

方式1:用preg_match_all获取所有候选后取最长

这种方法逻辑直观,容易理解和调试:

$str = "aXcdXf";
// 匹配所有长度1-5、以X结尾的子串
preg_match_all('/.{0,4}X/', $str, $matches);
$candidates = $matches[0];

// 按子串长度从长到短排序,长度相同则保留原出现顺序
usort($candidates, function($a, $b) {
    return strlen($b) - strlen($a);
});

$result = $candidates[0]; // 得到最长的目标子串
echo $result; // 输出:aXcdX

方式2:用preg_replace直接替换为目标子串

如果想一步到位用替换实现,可以用带负向预查的正则:

// 示例1:abXdef → abX
echo preg_replace('/^.*?(.{0,4}X)(?!.*.{0,4}X).*$/', '$1', "abXdef");

// 示例2:abcdX → abcdX
echo preg_replace('/^.*?(.{0,4}X)(?!.*.{0,4}X).*$/', '$1', "abcdX");

// 示例3:aXcdXf → aXcdX
echo preg_replace('/^.*?(.{0,4}X)(?!.*.{0,4}X).*$/', '$1', "aXcdXf");

// 你的测试用例:abcdXef → abcdX
echo preg_replace('/^.*?(.{0,4}X)(?!.*.{0,4}X).*$/', '$1', "abcdXef");

正则解释

针对方式2的正则/^.*?(.{0,4}X)(?!.*.{0,4}X).*$/:

  • ^.*?:从字符串开头非贪婪匹配任意字符,避免跳过更长的候选子串。
  • (.{0,4}X):捕获核心子串——0到4个任意字符+X,确保子串长度在1-5之间且以X结尾。
  • (?!.*.{0,4}X):负向预查,确保当前捕获的子串后面没有其他符合要求的子串(保证当前是最长的)。
  • .*$:匹配子串后面的所有剩余字符,替换时会被丢弃。

内容的提问来源于stack exchange,提问作者Samul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 19:33:21