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

使用Regex.Replace和通配符移除字符串中指定子串内的空格

问题解决方案

一、移除格式标签内的空格

针对翻译后出现的| {0} |这类带空格的标签,可通过精准匹配空格位置直接移除,同时保留标签内的数字占位符结构。

正则表达式与实现代码

推荐使用定位断言匹配标签内的多余空格,这种方式更高效且不会误改其他内容:

(?<=\|)\s*(?=\{)|(?<=\})\s*(?=\|)
  • (?<=\|)\s*(?=\{):匹配|之后、{之前的任意数量空格
  • (?<=\})\s*(?=\|):匹配}之后、|之前的任意数量空格

C#调用示例:

string input = "示例文案 | {123} | 附加内容 | {45} |";
string pattern = @"(?<=\|)\s*(?=\{)|(?<=\})\s*(?=\|)";
string result = Regex.Replace(input, pattern, string.Empty);
// 输出:"示例文案 |{123}| 附加内容 |{45}|"

也可通过捕获数字部分重构标签,适合需要同时校验数字格式的场景:

\|(\s*\{(\d+)\}\s*)\|

替换模板为|{$2}|,示例代码:

string input = "示例文案 | {123} | 附加内容 | {45} |";
string pattern = @"\|(\s*\{(\d+)\}\s*)\|";
string result = Regex.Replace(input, pattern, "|{$2}|");

二、仅针对指定子串执行正则操作

要限制正则仅在字符串的特定范围内生效,推荐两种优雅解法:

1. 利用MatchEvaluator定向处理

先匹配目标子串的范围,再对捕获到的内容单独执行替换逻辑,灵活性最高:
假设需要处理[translate]和[/translate]包裹的区域,示例代码:

string input = "无关内容 [translate]这里有 | {789} | 标签[/translate] 其他内容";
string rangePattern = @"(?<=\[translate\])(.*?)(?=\[/translate\])";
string result = Regex.Replace(input, rangePattern, match => 
    Regex.Replace(match.Value, @"(?<=\|)\s*(?=\{)|(?<=\})\s*(?=\|)", string.Empty)
);
// 输出:"无关内容 [translate]这里有 |{789}| 标签[/translate] 其他内容"
  • 外层正则通过正向/反向断言定位需要处理的子串范围
  • 内层通过MatchEvaluator回调,仅对捕获到的子串执行空格移除操作

2. 合并正则规则限定范围

如果子串边界规则明确,可将范围断言与空格匹配合并为一个正则(仅适用于边界无冲突的场景):

(?<=\[translate\].*?\|)\s*(?=\{)|(?<=\})(?=.*?\[/translate\])\s*(?=\|)

直接调用Regex.Replace即可完成定向替换,但这种方式对边界规则的兼容性较差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:49:58