C#字符串处理技术专题
.NET提供了String类和System.Text命名空间等来快速实现字符串处理功能,下面对字符串处理进行详细介绍。
- 比较字符串
- 定位字符及子串
- 格式化字符串
- 截取字符串
- 分割字符串
- 插入和填充字符串
- 删除和剪贴字符串
- 复制字符串
- 替换字符串
- StringBuilder的定义和使用
- String和可变字符串类StringBuilder的区别
比较字符串
比较字符串是指按照字典排序的规则,判断两个字符串的大小。
String类中,常用的比较字符串的方法包括Compare,CompareTo以及Equals等。
1.Compare方法
Compare方法是String类的静态方法,用于全面比较两个字符串对象。
常用的方法:
int Compare(string strA,string strB)
参数说明:
strA,strB待比较的两个字符串
返回值:
参数条件 | 返回值 |
strA小于strB | 负整数 |
strA大于strB | 正整数 |
strA等于strB | 0 |
Demo:
class Program
{
static void Main(string[]args)
{
String str1 = "你好";
String str2 = "你好吗";
//字符串比较
Console.WriteLine(String.Compare(str1,str2));
Console.WriteLine(String.Compare(str1,str1));
Console.WriteLine(String.Compare(str2,str1));
}
}
结果:
2.CompareTo方法
CompareTo方法将当前字符串对象与另一个字符串对象作比较,作用与Compare类似,返回值也相同。
Demo:
class Program
{
static void Main(string[]args)
{
string strA = "Hello";
string strB = "HI";
Console.WriteLine(strA.CompareTo(strB));
}
}
结果:
CompareTo与Compare区别:
1.CompareTo不是静态方法,可以通过一个String对象调用
2.CompareTo没有重载形式,只能按照大小写敏感方式比较两个整串。
3.Equals方法
Equals方法用于判断两个字符串是否相同。
Demo:
class Program
{
static void Main(string[]args)
{
String strA = "1";
String strB = "1";
//Equals方法的使用
Console.WriteLine(String.Equals(strA,strB));
Console.WriteLine(strA.Equals(strB));
}
}
结果:
定位字符及子串
定位子串是指一个字符串中寻找其中包含的子串或者某个字符。
在String类中,常用的定位子串和字符的方法包括:
StartWith/EndsWith
IndexOf/LastIndexOf
1.StartWith/EndsWith方法
StartWith方法可以判断一个字符串对象是否以另一个子字符串开头,如果是,返回True,否则返回False。
EndsWith方法可以判断一个字符串是否以另一个字符串结尾。
Demo:
class Program
{
static void Main(string[]args)
{
String strA = "Welcome toBeijin";
Console.WriteLine(strA.StartsWith("W"));
Console.WriteLine(strA.EndsWith("n"));
}
}
结果:
2.IndexOf/LastIndexOf方法
IndexOf方法用于搜索在上一个字符串中,某个特定的字符或子串第一次出现的位置,该方法区分大小写,并从字符串的首字符开始以0计数。如果字符串中不包含这个字符和子串,则返回-1。
LastIndexOf用于搜索在一个字符串中,某个特定的字符或字串最后一次出现的位置。
Demo:
class Program
{
static void Main(string[]args)
{
String strA = "HelloWorld";
Console.WriteLine(Convert.ToString(strA.IndexOf("o")));//o第一次出现的位置
Console.WriteLine(Convert.ToString(strA.LastIndexOf("o")));//o最后一次出现的位置
}
}
结果:
格式化字符串
Format方法用于创建格式化的字符串以及连接多个字符串对象。
方法的格式:
publicstatic string Format(string format,param object[] args)
说明:
format:返回字符串的格式
args:一系列变量参数
示例:
classProgram
{
static void Main(string[]args)
{
string strA = "Hello";
string strB = "World";
string newStr =String.Format("{0},{1}",strA,strB);
Console.WriteLine(newStr);
//将当前时间格式化为YYYY-MM-dd
DateTime Dta = DateTime.Now;
string strC = String.Format("{0:d}",Dta);//{0:d}表示将时间格式化为短日期表示形式
Console.WriteLine(strC);
}
}
截取字符串
截取字符串需要用到String类的Substring方法,该方法用来从字符串中检索子字符串
n 两种形式:
1.publicstring Substring(int startIndex)
startIndex:字符串中子字符串的起始字符位置
返回值:一个String对象,它等于字符串中从startIndex开始的子字符串,如果startIndex等于此字符串的长度,则为Empty。
2.publicstring Substring(int startIndex,int length)
startIndex:子字符串的起始位置的索引
length:子字符串中的字符数
返回值:一个String,它等于字符串中从startIndex开始的长度为length的子字符串,如果startIndex等于此字符串的长度且length为0,则为Empty。
Demo:
class Program
{
static void Main(string[]args)
{
string strA = "HelloWorld";
Console.WriteLine("strA={0}",strA);
//截取从第三个字符开始到结束的子串
string strB = strA.Substring(3);
Console.WriteLine("strB={0}",strB);
//截取从第六个字符开始,长度为5的子串
string strC = strA.Substring(6,5);
Console.WriteLine("strC={0}",strC);
}
}
结果:
分割字符串
使用Split方法可以将一个字符串,按照某个分隔符,分割成一系列小的字符串。
例如:Hello^^World按照字符^进行分割,可以得到3个小的字符串,即”Hello”,””(空串)和”World”。
Demo:
class Program
{
static void Main(string[]args)
{
string strA = "成^^功";
char[] separator = { '^' };
string[] splitstrings = newstring[100];
splitstrings =strA.Split(separator);
int i= 0;
while(i < splitstrings.Length)
{
Console.WriteLine("item{0}:{1}",i,splitstrings[i]);
i++;
}
}
}
结果:
插入和填充字符串
String类包含了一个字符串中插入新元素的方法,可以用Insert在字符串的任意位置插入任意字符。
使用String类的PadLeft/PadRight方法,可以在一个字符串的左右两侧进行字符填充。
1.Insert方法
Insert方法用于在一个字符串的指定位置插入另一个字符串,从而构造一个新的字符串。
class Program
{
static void Main(string[]args)
{
string strA = "HI";
string strB = "World";
string newStr = "";
newStr = strA.Insert(1,strB); //在指定的位置插入strB
Console.WriteLine(newStr);
}
}
2.PadLeft/PadRight方法
有时候需要对一个字符串进行填充,例如把”HI”变为长度为4个字符的字符串,并使用字符”@”填充,即变成”@@HI”或”HI@@”。
PadLeft方法用于在一个字符串的左侧进行填充,使其达到一定的长度。
PadRight方法用于在一个字符串的右侧进行填充,使其达到一定的长度。
Demo:
class Program
{
static void Main(string[]args)
{
/*PadLeft and PadRight 示例 */
string strA = "HI";
string strB = "";
string strC = "";
strB= strA.PadLeft(4,'@');
strC= strA.PadRight(4,'@');
Console.WriteLine("strB={0}",strB);
Console.WriteLine("strC={0}",strC);
}
}
删除和剪贴字符串
使用Remove方法在任意字符串的任意位置删除任意长度的子字符串。
使用Trim, TrimEnd或TrimStart方法剪切掉字符串中的一些特殊字符。
1.Remove方法
Remove方法从一个字符串的指定位置开始,删除指定数量的字节。
方法格式:
public StringRemove(int startIndex,int Clunt)
startIndex:用于指定开始删除的位置,索引从0开始。
Clunt:指定删除的字节数量
Demo:
class Program
{
static void Main(string[]args)
{
string strA = "Happy";
string strB = "";
strB = strA.Remove(2,3);//删除从第三个字符开始,长度为3的子字符串
Console.WriteLine("strA={0}",strA);
Console.WriteLine("strB={0}",strB);
}
}
2.Trim方法
作用:
1.从字符串的开始位置和末尾移除空白字符的所有匹配项。
public string Trim()
返回值:一个新String,相当于将指定字符串的首尾空白字符移除后形成的字符串。
2.从字符串的开始和末尾移除数组中指定的一组字符的所有匹配项。
public stringTrim(params char[] trimChars)
trimChars:数组中包含了指定要去掉的字符,如果缺省,则删除空格符号。
返回值:从指定字符串的开始和结尾移除trimChars中字符的所有匹配项后剩余的String,如果trimChars为空引用,则改为移除空白字符。
Dmeo:
class Program
{
static void Main(string[]args)
{
string strA = " Program Test ";
string strB = "";
string strC = "@Happy#$";
char[] strD = {'@','#','$' };
strB= strA.Trim();//移除strA首尾的空白字符
Console.WriteLine("strA={0}",strA);
Console.WriteLine("strB={0}",strB);
strB= "";
strB= strC.Trim(strD);//移除strC中含有strD中的字符
Console.WriteLine("strC={0}",strC);
Console.WriteLine("strB={0}",strB);
}
}
3.TrimStart/TrimEnd方法
TrimStart方法:用来从字符串的开始位置移除数组中指定的一组字符的所有匹配项
public string TrimStart(params char[] trimChars)
TrimEnd方法:用来从字符串的结尾移除数组中指定的一组字符的所有匹配项
public string TrimEnd(params char[] trimChars)
Demo:
class Program
{
static void Main(string[]args)
{
string strA = "";
char[] strB = {'@','#','$' };
string strC = "@ Happy#$";
strA= strC.TrimStart(strB);
Console.WriteLine("strC={0}",strC);
Console.WriteLine("strA={0}",strA);
strA= "";
strA= strC.TrimEnd(strB);
Console.WriteLine("strC={0}",strC);
Console.WriteLine("strA={0}",strA);
}
}
复制字符串
String类包含了复制字符串的两种方法Copy和CopyTo。
Copy方法:把一个字符串复制到另一个字符数组中。
CopyTo方法:可以实现和Copy相同的功能,同时可以复制源字符串中的一部分到一个字符数组中。
1.Copy方法
Copy方法格式:
public static string Copy(string str)
str:为需要复制的源字符串,方法返回目标字符串。
返回值:与str具有相同值的新String
示例:
strA = “Hello”;
strB = “”;
strB = string.Copy(strA);
2.CopyTo方法
CopyTo方法格式:
public void CopyTo(int sourceIndex,char[]destination,int destinationIndex, int count)
CopyTo方法参数值及说明:
参数 | 说明 |
sourceIndex | 需要复制的字符的起始位置 |
destination | 目标字符数组 |
destinationIndex | 指定目标数组中的开始存放位置 |
count | 指定要复制的字符个数 |
Demo:
class Program
{
static void Main(string[]args)
{
string strA = "Happy";
char[] strB = new char[100];
strA.CopyTo(0,strB,0,3);
Console.WriteLine("strA={0}",strA);
Console.WriteLine(strB);
}
}
替换字符串
要替换一个字符串中的某些特定的字符或者某个子串,使用Replace方法。
Replace方法:
public stringReplace(char oldChar,char newChar)
oldChar:待替换的字符 newChar:替换后的字符
public string Replace(string oldstring,stringnewstring)
oldstring:待替换的子串 newstring替换后的新子串
Demo:
class Program
{
static void Main(string[]args)
{
string strA = "Hello";
string strB =strA.Replace("ll","r");
Console.WriteLine("strA={0}",strA);
Console.WriteLine("strB={0}",strB);
}
}
StringBuilder的定义和使用
StringBuilder类位于System.Text命名空间下,表示可变字符串。
程序中存储不确定的字符串时,需要使用StringBuilder类。
StringBuilder类常用方法及说明:
Demo:
class Program
{
static void Main(string[]args)
{
//创建了一个StringBuilder的对象
StringBuilder Builder = newStringBuilder();
Builder.Append("HelloWorld");//追加字符串
Console.WriteLine(Builder);
Builder.AppendFormat("{0} End","@");//追加格式化字符串
Console.WriteLine(Builder);
Builder.AppendLine(" This isone line.");//将默认的行终止符追加到结尾
Console.WriteLine(Builder);
Builder.Insert(0, "Begin");//将指定对象的字符串插入到此实例指定位置
Console.WriteLine(Builder);
//Builder.Length指Builder实例的长度
Builder.Remove(19,Builder.Length-19);//将指定范围的字符从实例中移除
Console.WriteLine(Builder);
Builder.Replace(“Begin”,“Begin:”);//替换字符串
Console.WriteLine(Builder);
}
}
结果:
总结:
StringBuilder类表示值为可变字符序列的对象,其值可变的原因是由于在通过追加,删除,替换或插入而创建其实例后对其修改。
String和可变字符串类StringBuilder的区别
StringBuilder表示可变字符串,String是不可改变的。
使用System.String类中的方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配内存,在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销非常昂贵。
使用StringBuilder目的就是针对大量String操作,避免产生太多的临时对象,当程序只是对某个字符串进行一次或几次操作时,采用String类即可。