使用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
相关产品推荐
相关产品推荐

