问题描述
C#/.NET应用程序编程开发中,如果要替换一个字符串中的单个字符,可以使用string.Replace()
方法,比如我们要将以下字符串中的横线替换成空格,则可以:
var str = "replace-multiple-characters-in-a-c-sharp-string";
str = str.Replace("-"," ");
Console.WriteLine(str);
那如果要同时替换字符串中的多个字符,又应该怎么操作呢?
比如,现要替换以下字符串中的多个字符(;,\r\n\t)为换行符\n
var str = "replace;multiple,characters\tin;a,c\rsharp,string";
是不是使用多个Replace()
方法呢,如:
str = str.Replace(';', '\n').Replace(',', '\n').Replace('\r', '\n').Replace('\t', '\n');
首先,这样操作的结果是没有问题的,但如果替换的字符中动态的呢,比如可能替换(;,\r\n\t)中的一个或者几个,又怎么实现呢?
方案一
使用正则表达式可实现动态替换,如下(完整示例):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
var str = "replace;multiple,characters\tin;a,c\rsharp,string";
var result = ReplaceMultiple(str, "[;,\t\r]|[\n]{2}");
Console.WriteLine(result);
}
private static string ReplaceMultiple(string input, string pattern)
{
var result = Regex.Replace(input, pattern, "\n");
return result;
}
}
输出结果:
replace
multiple
characters
in
a
c
sharp
string
方案二
使用string.Split()
方法分词,然后再合并,如下:
char[] separators = new char[]{' ',';',',','\r','\t','\n'};
string s = "replace;multiple,characters\tin;a,c\rsharp,string";
string[] temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries);
s = String.Join("\n", temp);
方案三
使用Linq
的Aggregate()
扩展方法,如下:
string s = "replace;multiple,characters\tin;a,c\rsharp,string";
char[] chars = new char[] { ' ', ';', ',', '\r', '\t', '\n' };
string snew = chars.Aggregate(s, (c1, c2) => c1.Replace(c2, '\n'));
或者封装成一个静态扩展方法,如下:
public static string ReplaceAll(this string seed, char[] chars, char replacementCharacter)
{
return chars.Aggregate(seed, (str, cItem) => str.Replace(cItem, replacementCharacter));
}
调用示例:
string snew = s.ReplaceAll(chars, '\n');
方案四
使用StringBuilder
的静态扩展方法,如下:
public static void MultiReplace(this StringBuilder builder,
char[] toReplace,
char replacement)
{
var set = new bool[256];
foreach (var charToReplace in toReplace)
{
set[charToReplace] = true;
}
for (int i = 0; i < builder.Length; ++i)
{
var currentCharacter = builder[i];
if (set[currentCharacter])
{
builder[i] = replacement;
}
}
}
调用示例:
var builder = new StringBuilder("my bad,url&slugs");
builder.MultiReplace(new []{' ', '&', ','}, '-');
var result = builder.ToString();
温馨提示:本文标注有(完整示例)的示例代码可以直接粘贴在try.dot.net中运行。
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册