C#/正则如何查找替换字符串中每第n次出现的指定字符(JS转C#)
功能需求
查找并替换给定字符串中每第3次出现的指定字符,将其替换为H
- 输入示例:
74Mercedes1980 - 预期输出:
74HerHedHs1H80 - 实现要求:可选择C#原生代码或正则表达式实现
C#正则实现(等效原JS逻辑)
原JS正则核心逻辑为全局匹配「连续出现n-1次目标字符+中间非目标字符内容+第n个目标字符」,捕获前半段内容后,替换时保留捕获内容、仅把第n个目标字符换成指定替换值。C#中直接使用Regex.Replace即可实现等效全局替换,代码已自动处理正则元字符转义问题:
using System.Text.RegularExpressions; /// <summary> /// 替换字符串中每第n次出现的指定字符 /// </summary> /// <param name="input">原始输入字符串</param> /// <param name="target">待查找的目标字符</param> /// <param name="replaceVal">替换后的字符</param> /// <param name="n">每第n次命中时替换,默认值为3</param> public static string ReplaceNthOccurrenceRegex(string input, char target, char replaceVal, int n = 3) { string escapedTarget = Regex.Escape(target.ToString()); string pattern = $"((?:[^{escapedTarget}]*{escapedTarget}){{{n-1}}}[^{escapedTarget}]*){escapedTarget}"; return Regex.Replace(input, pattern, $"$1{replaceVal}"); } // 调用示例 // string testInput = "74Mercedes1980"; // string result = ReplaceNthOccurrenceRegex(testInput, 'e', 'H');
说明:如果目标字符是
.、*、$这类正则特殊元字符,Regex.Escape会自动完成转义,无需手动调整匹配规则。
C#原生遍历实现(无正则依赖,性能更优)
不想引入正则的场景可以直接遍历字符数组计数实现,逻辑更直观,长字符串处理场景下性能明显优于正则方案:
/// <summary> /// 替换字符串中每第n次出现的指定字符(原生遍历版) /// </summary> public static string ReplaceNthOccurrenceNative(string input, char target, char replaceVal, int n = 3) { char[] charArr = input.ToCharArray(); int hitCount = 0; for (int i = 0; i < charArr.Length; i++) { if (charArr[i] == target) { hitCount++; if (hitCount == n) { charArr[i] = replaceVal; hitCount = 0; } } } return new string(charArr); } // 调用示例 // string testInput = "74Mercedes1980"; // string result = ReplaceNthOccurrenceNative(testInput, 'e', 'H');
内容的提问来源于stack exchange,提问作者user8189
相关产品推荐
相关产品推荐

