
本文介绍一种简洁可靠的正则方案,通过单次 preg_replace 同时实现三重目标:移除所有非目标字符、过滤数字与括号、合并连续重复的目标字符(如 {G}{G} → G),且支持灵活指定保留字符集(如 [GUW])。
本文介绍一种简洁可靠的正则方案,通过单次 `preg_replace` 同时实现三重目标:移除所有非目标字符、过滤数字与括号、合并连续重复的目标字符(如 `{g}{g}` → `g`),且支持灵活指定保留字符集(如 `[guw]`)。
要处理形如 {1}{G}{G}{U}{U}{W} 的字符串,并精准提取、去重、拼接指定字母(如 G、U、W),得到 GUW,关键在于区分“保留目标”与“彻底丢弃”两类内容,而非在匹配后做复杂逻辑判断。
推荐正则表达式为:
(\{([GUW])})\1*|.
✅ 表达式解析:
-
(\{([GUW])}):捕获组 1 匹配完整{X}结构,其中X必须是[GUW]中的字符;组 2 单独捕获该字符X(即{G}→ 组2为G); -
\1*:允许组1内容零次或多次重复(如{G}{G}{G}全部被组1覆盖); -
|:或操作符; -
.:匹配任意其他所有字符(包括{1}、孤立的{、}、数字、空格等),它们将被统一替换为空。
由于整个模式始终匹配一个单位(要么是有效 {X} 序列,要么是任意单字符),preg_replace 会逐字符/逐块扫描并替换——对有效序列,用 (即内部字符)替代;对无效内容,用空字符串替代,自然实现“只留目标字符、顺序不变、自动去重”。
? 使用示例(PHP):
$re = '/(\{([GUW])})\1*|./';
$str = '{1}{G}{G}{U}{U}{W}';
$result = preg_replace($re, '$2', $str);
echo $result; // 输出:GUW
⚠️ 注意事项:
- 字符集
[GUW]可按需修改(如[ABCD]或[a-z]),但需确保其为合法字符类语法; - 该正则依赖贪婪匹配与回溯机制,对超长字符串性能敏感,建议用于中短文本(
- 若源字符串含未闭合
{或嵌套结构(如{G{U}}),本方案不适用——它专为标准{X}平铺格式设计; - 在 JavaScript 中需使用
replace()配合全局标志g,且注意$2写法兼容性(ES2020+ 支持,旧环境可用函数回调)。
此方案以「匹配即转化」为核心思想,避免多步正则或循环处理,兼具可读性、扩展性与执行效率,是处理此类标记化字符串的理想选择。











