.Net(C#) 实现replace字符串替换只替换一次的方法

.NET 中,string.Replace 方法通常会替换所有出现的匹配项。如只想替换字符串中的第一个匹配项,可以使用其他方法,比如正则表达式或者手动处理。本文主要介绍.Net(C#)替换字符串时,实现replace替换字符串只替换一次的方法代码。分别通过StringBuilder、正则表达式(Regex)、IndexOf和Substring实现,并且可以通过扩展方法简化代码方便调用。

1、使用StringBuilder替换

使用 StringBuilder.Replace 方法,通过指定范围来实现只替换字符串中的第一个匹配项。这种方式是有效的,通过指定范围来确保只替换一次指定字符。

using System;
using System.Text;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "hello world! cjavapy!!!";
            
            // 使用 StringBuilder 并指定范围进行一次替换
            StringBuilder sb = new StringBuilder(str);
            str = sb.Replace("!", "b", 
            0, str.IndexOf("!") + 1).ToString();

            // 输出结果
            Console.WriteLine(str);  
            // 输出:hello worldb cjavapy!!!
            Console.ReadKey();
        }
    }
}

2、使用正则表达式(Regex)替换

使用 Regex.Replace 函数,通过最后一个参数指定只替换第一个匹配项。这是一种非常灵活的方法,适用于复杂模式的替换。

using System;
using System.Text.RegularExpressions;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "hello world! cjavapy!!!";
            
            // 创建正则表达式对象,用于匹配 "!"
            Regex regex = new Regex("!");

            // 使用 Regex.Replace 替换第一个 "!" 为 "b"
            str = regex.Replace(str, "b", 1); 
            // 1 表示只替换一次
            
            // 输出结果
            Console.WriteLine(str);  
            // 输出:hello worldb cjavapy!!!

            Console.ReadKey();
        }
    }
}

3、使用IndexOf和Substring替换

通过 IndexOf 查找第一个出现的 "!",然后使用 Substring 拼接字符串,实现只替换一次。这个方法简单且高效,适用于替换第一个出现的匹配项。

using System;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "hello world! cjavapy!!!";

            // 查找第一个 "!" 的索引
            int index = str.IndexOf("!");

            // 如果找到 "!",则进行替换
            if (index >= 0)
            {
                str = str.Substring(0, index) 
                + "b" 
                + str.Substring(index + 1);
            }

            // 输出结果
            Console.WriteLine(str);  
            // 输出:hello worldb cjavapy!!!

            Console.ReadKey();
        }
    }
}

4、通过扩展方法实现ReplaceOne

实现一个扩展方法 ReplaceOne,用于在字符串中只替换第一次出现的 oldStrnewStr。这种方法非常实用,尤其是在需要对字符串进行局部替换时。

扩展方法实现代码

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication
{
    public static class StringReplace
    {
    public static string ReplaceOne(this string str, 
    string oldStr, string newStr)
        {
               StringBuilder sb = new StringBuilder(str);
            int index = str.IndexOf(oldStr);
            if (index > -1)
                return str.Substring(0, index) 
                + newStr + str.Substring(index
                + oldStr.Length);
            return str;
        }
     }
}

调用代码

using System;
using System.Text;

namespace ConsoleApplication
{
    // 扩展 String 的类
    public static class StringReplace
    {
        // 定义一个扩展方法 ReplaceOne,只替换一次 oldStr 为 newStr
        public static string ReplaceOne(this string str, 
        string oldStr, string newStr)
        {
            // 使用 StringBuilder 来构建新的字符串
            StringBuilder sb = new StringBuilder(str);

            // 查找 oldStr 第一次出现的索引
            int index = str.IndexOf(oldStr);

            // 如果找到 oldStr,进行替换
            if (index > -1)
            {
                // 将字符串切割并拼接
                return str.Substring(0, index)
                + newStr 
                + str.Substring(index 
                + oldStr.Length);
            }

            // 如果没找到 oldStr,返回原始字符串
            return str;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // 测试 ReplaceOne 方法
            string str = "hello world! hello again!";
            
            // 只替换第一次出现的 "hello"
            string result = str.ReplaceOne("hello", "hi");

            // 输出结果
            Console.WriteLine(result); 
            // 输出:hi world! hello again!

            Console.ReadKey();
        }
    }
}
推荐阅读
cjavapy编程之路首页