C# 字符串处理
.NET 提供了String类和System.Text命名空间来快速实现字符串处理功能。
字符串比较
比较字符串是指按照字典排序的规则,判断两个字符串的大小。前面的字母要小于后面的字母。String类中,常见的比较字符串的方法有Compare、CompareTo、CompareOrdinal以及Equals等。
Compare方法
Compare方法是String类的静态方法,用于全面比较两个字符串对象。包含多种重载方式:
Int Compare(string strA, string strB)
Int Compare(string strA, string strB, bool ignoreCase)
Int Compare(string strA, string strB, bool ignoreCase, CultureInfo)
Int Compare(string strA, int indexA, string strB, int indexB, int length)
Int Compare(string strA, int indexA, string strB, int indexB, int length, bool ignoreCase)
各参数的含义如下:
- strA,strB--待比较的两个字符串;
- ignoreCase--指定是否考虑大小写,当取true时忽略大小写;
- indexA,indexB--需要比较两个字符串的子串时,indexA和indexB分别为子字符串的起始位置;
- length--待比较字符串的最大长度;
- culture--字符串的区域性信息。
Compare方法的返回值:若strA>strB返回正整数; 若strA=strB,返回0; 若strA<strB,返回负整数。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string strA = "你好";
string strB = "你好吗";
// 字符串比较
Console.WriteLine(string.Compare(strA, strB));
Console.WriteLine(string.Compare(strA, strA));
Console.WriteLine(string.Compare(strB, strA));
}
}
}
输出:
说明:CompareOrdinal方法和Compare方法非常类似,但不考虑区域性问题,下面不再详细介绍CompareOrdinal方法。
CompareTo方法
CompareTo方法将当前字符串对象与另一个字符串对象作比较,作用与Compare方法类似,返回值也是相同的。
CompareTo方法和Compare方法区别在于:
- CompareTo方法不是静态方法,可以通过一个String对象调用;
- CompareTo方法没有重载形式,只能按照大小写敏感的方式比较两个整串。
下面使用CompareTo比较两个字符串:
string strA = "你好";
string strB = "你好吗";
Console.WriteLine(strA.CompareTo(strB));
Equals方法
如果两个字符串相等,Equals()返回值为true;否则,返回false。
string strA = "你好";
string strB = "你好吗";
Console.WriteLine(string.Equals(strA, strB));
Console.WriteLine(strA.Equals(strB));
定位字符及子串
定位子串是指一个字符串中寻找其中包含的子串或者某个字符,String类中常见方法包括StartsWith/EndsWith、IndexOf/LastIndexOf 以及 IndexOfAny/LastIndexOfAny。
StartsWith/EndsWith
StartWith方法可以判断一个字符串对象是否以另一个子字符串开头,如果是,返回true。
Public bool StartsWith(String value);
其中,value表示待判定的子字符串。
EndsWith方法判断一个字符串对象是否以另一个子字符串结尾。
IndexOf/LastIndexOf
IndexOf方法用于搜索在上一个字符串中,某个特定的字符或字符串第一次出现的位置,该方法区分大小写,并从字符串的首字符开始以0计数。如果字符串中不包含这个字符或子串,则返回-1。IndexOf主要有以下重载形式:
定位字符
Int IndexOf(char value)
Int IndexOf(char value, int startIndex)
Int IndexOf(char value, int startIndex, int count)
定位子串
int IndexOf(string value)
int IndexOf(string value, int startIndex)
int IndexOf(string value, int startIndex, int count)
各参数的含义是:
- value--带定位的字符或子串;
- startIndex--在总串中开始搜索的起始位置;
- count--在总串中从起始位置开始搜索的字符数。
string strA = "Hello";
Console.WriteLine(strA.IndexOf('l'));
同IndexOf类似,LastIndexOf方法用于搜索在一个字符串中,某个特定的字符或子串最后一次出现的位置。
IndexOfAny/LastIndexOfAny
IndexOfAny方法功能与IndexOf类似,区别在于它可以在一个字符串中搜索一个字符数组中任意字符第一次出现的位置。同样,该方法区分大小写,并从字符串的首字符开始以0计数。如果字符串中不包含这个字符或子串,则返回-1。
IndexOfAny有以下重载形式:
int IndexOfAny(char[] anyOf)
int IndexOfAny(char[] anyOf, int startIndex)
int IndexOfAny(char[] anyOf, int startIndex, int count)
各参数的含义:
- anyOf--待定位的字符数组,方法将返回这个数组中任意一个字符第一次出现的位置;
- startIndex--在总串中开始搜索的起始位置;
- count--在总串中从起始位置开始搜索的字符数。
string strA = "Hello";
char[] anyOf = { 'e', 'o' };
Console.WriteLine(Convert.ToString(strA.IndexOfAny(anyOf)));
Console.WriteLine(Convert.ToString(strA.LastIndexOfAny(anyOf)));
同IndexOfAny类似,LastIndexOfAny用于在一个字符串中搜索一个字符数组中任意字符最后一次出现的位置。
格式字符串
Format方法用于创建格式化的字符串以及连接多个字符串对象。最常用的重载形式为
public static string Format(string Format, params object[] arge);
- format--用于指定返回的字符串的格式;
- args--一系列变量参数。
string newStr = string.Format("{0},{1}!!!", strA, strB);
在特定的应用中,Format方法也很方便。例如,将当前时间格式为"YYYY-MM-DD"形式:
DateTime DTA = DateTime.Now();
string strB = string.Format("{0:d}", DTA);
说明:{0:d}表示将时间格式化为短日期表示形式。
截取字符串
截取字符串需要用到String类的Substring方法,该方法用来从字符传中检索子字符串,有以下重载形式:
从字符串中检索子字符串,子字符串从指定的字符位置开始
public string Substring(int startIndex)
startIndex--字符串中子字符串的起始字符位置。
返回值:一个String对象,等于字符串中从startIndex开始的子字符串,如果startIndex等于此字符串的长度,返回Empty。
从字符串中检索子字符串,子字符串从指定的字符位置开始且具有指定的长度
public string Substring(int startIndex, int length)
startIndex--字符串中子字符串的起始字符位置。
length--子字符串中的字符数。
返回值:一个String对象,等于字符串中从startIndex开始的长度为length的子字符串,如果startIndex等于此字符串的长度,且length为0,返回Empty。
分隔字符串
使用Split方法可以将一个字符串,按照某个分隔符,分割成一系列小的字符串。
Split方法有多个重载形式,最常见的:
public string[] split(params char[] separator);
separator--一个数组,包含分隔符。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string strA = "Hello^^world";
char[] separator={'^'};
string[] splitstrings=new string[100];
splitstrings=strA.Split(separator);
int i= 0;
while(i<splitstrings.Length)
{
Console.WriteLine("item{0}:{1}",i,splitstrings[i]);
i++;
}
Console.ReadLine();
}
}
}
输出:
插入和填充字符串
String类可以用Insert方法在字符串的任意位置插入任意字符。而使用PadLeft/PadRight方法,可以在一个字符串的左右两侧可以进行字符填充。
Insert方法
Insert方法用于在一个字符串的指定位置插入另一个字符串,从而构造一个新的字符串。最常用的重载形式:
public string Insert(int startIndex, string value);
startIndex--用于指定要插入的位置,索引从0开始。
value--指定要插入的字符串。
返回值--指定字符串的一个新String等效项,但在位置startIndex处插入value。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string strA = "Hello^^world";
string strB = "Good morning!";
string newStr = strA.Insert(1, strB);
Console.WriteLine(newStr);
Console.ReadLine();
}
}
}
输出:
PadLeft/PadRight
PadLeft用于在一个字符串左侧进行字符填充,使其达到一定的长度。有以下重载形式:
public string PadLeft(int totalWidth)
public string PadLeft(int totalWidth, char paddingChar)
totalWidth--指定填充后的字符长度。
paddingChar--指定要填充的字符,如果缺省,则填充空格符号。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string strA = "Hello^^world";
string newStr;
newStr = strA.PadLeft(16, '*');
Console.WriteLine(newStr);
Console.ReadLine();
}
}
}
输出:
PadRight功能类似,不再赘述。
删除和剪切字符串
String类使用Remove在字符串任意位置删除任意长度子字符串,也可以使用Trim、TrimEnd和TrimStart剪切掉字符串中的一些特定字符串。
Remove方法
Remove方法从一个字符串的指定位置开始,删除指定数量的字符。最常用的语法格式:
Public String Remove(int startIndex, int count);
startIndex--用于指定开始删除的位置,索引从0开始。
count--指定删除的字符数量。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string strA = "Hello^^world";
string newStr;
newStr = strA.PadLeft(16, '*');
Console.WriteLine(newStr);
Console.WriteLine(newStr.Remove(2, 3));
Console.ReadLine();
}
}
}
输出:
Trim方法
有以下重载形式:
从字符串的开始位置和末尾移除空白字符的所有匹配项。
public string Trim()
返回值--一个新String,相当于将指定字符串首位空白字符移除后形成的字符串。
从字符串的开始位置和末尾移除数组中指定的一组字符的所有匹配项
public string Trim(params char[] trimChars)
trimChars--数组包含了指定要去掉的字符,如果缺省,则删除空格符号)。
返回值--从指定字符串的开始和结尾移除trimChars中字符的所有匹配项后剩余的String。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string strA = "Hello^^world";
string newStr;
newStr = strA.PadLeft(16, '*');
Console.WriteLine(newStr);
char[] strB={'*','d'};
Console.WriteLine(newStr.Trim(strB));
Console.ReadLine();
}
}
}
输出:
TrimStart方法
TrimStart方法用来从字符串的开始位置移除数组中指定的一组字符的所有匹配项。
public string TrimStart(params char[] trimChars)
trimChars--数组包含了指定要去掉的字符,如果缺省,则删除空格符号)。
返回值--从指定字符串的开始位置移除trimChars中字符的所有匹配项后剩余的String。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string strA = "Hello^^world";
char[] strB = { 'H', 'o' };
string strC = strA.TrimStart(strB);
Console.WriteLine(strC);
Console.Read();
}
}
}
输出:
PS:注意字符区分大小写。如上面改为"h",则仍然输出Hello^^World。
TrimEnd方法
类比TrimStart即可。
复制字符串
String类包含了复制字符串的两种方法Copy和CopyTo。
Copy方法
若要把一个字符串赋值到另一个字符数组中,可以使用String的静态方法Copy来实现。
public static string Copy(string str);
str--为需要复制的源字符串,方法返回目标字符串。
返回值--与str具有相同值的新String。
CopyTo方法
CopyTo方法功能更为丰富,可以复制源字符串的一部分到一个字符数组中。另外,它不是静态方法。
public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)
各参数的含义:
- sourceIndex--需要复制的字符的起始位置。
- destination--目标字符数组。
- destinationIndex--指定目标数组的开始存放位置。
- count--指定要复制的字符个数。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string strA = "Hello^^world";
char[] strB = new char[100];
strA.CopyTo(3, strB, 0, 3);
Console.WriteLine(strB);
Console.Read();
}
}
}
输出:
替换字符串
如果要替换掉某个字符串的某些特定字符或者某个子串,可以使用Repalce方法。
Replace方法
其语法形式主要有:
public string Replace(char oldChar,char newChar)
public string Replace(string oldValue,string newValue)
- oldChar--待替换的字符。
- oldChar--待替换的子串。
- newChar--替换后的新字符。
- newValue--替换后的新子串。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string strA = "Hello";
string strB=strA.Replace("ll","r");
Console.WriteLine(strB);
Console.Read();
}
}
}
输出:
StringBuilder的定义和使用
StringBuilder类位于System.Text命名空间下,它表示可变字符串。
StringBuilder的定义
StringBuilder myStringBuilder=new StringBuilder();
StringBuilder的构造函数:
- StringBuilder()--初始化StringBuilder类的新实例。
- StringBuilder(Int32)--使用指定的容量初始化StringBuilder类的新实例。
- StringBuilder(String)--使用指定的字符串初始化StringBuilder类的新实例。
- StringBuilder(Int32,Int32)--初始化StringBuilder类的新实例,该类起始于指定容量并且可增长到指定的最大容量。
- StringBuilder(String,Int32)--使用指定的字符串和容量初始化StringBuilder类的新实例。
- StringBuilder(String,Int32,Int32,Int32)--使用指定的子字符串和容量初始化StringBuilder类的新实例。
StringBuilder使用
StringBuilder类常用属性说明:
- Capacity--获取或设置可包含在当前实例所分配的内存中的最大字符数。
- Chars--获取或设置此实例中指定字符位置处的字符。
- Length--获取或设置此实例的长度。
- MaxCapacity--获取此实例的最大容量。
StringBuilder类常用的方法说明:
- Append--在此实例的结尾追加指定对象的字符串表示形式。
- AppendFormat--向此实例追加包含零个或更多格式规范的格式化字符串。每个格式规范由相应对象的字符串表示形式替换。
- AppendLine--将默认的行终止符(或指定字符串的副本和默认的行终止符)追加到此实例的结尾。
- CopyTo--将此实例的指定段中的字符复制到目标Char数组的指定段中。
- EnsureCapacity--将确保StringBuilder的此实例的容量至少是指定值。
- Insert--将指定对象的字符串表示形式插入到此实例中的指定字符位置。
- Remove--将指定范围的字符从此实例中移除。
- Replace--将此实例中所有的指定字符或字符串替换为其他的指定字符或字符串。
- ToString--将StringBuilder的值转化为String。
StringBuilder类表示值为可变字符序列的对象,其值可变的原因是同过追加、删除、替换或插入字符而创建后的实例可以对其进行修改。几乎所有修改此类的实例方法都返回对同一实例的引用。
StringBuilder的容量是实例在任何给定时间可存储的最大字符数,并且大于或等于实例值的字符串表示形式的长度。容量可以通过Capacity属性或EnsureCapacity方法来增加或减少,但不能小于Length属性的值。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
StringBuilder Builder = new StringBuilder("Hello", 100);
Builder.Append(" World");
Console.WriteLine(Builder);
Builder.AppendFormat("{0} End", "@");
Console.WriteLine(Builder);
Builder.AppendLine("This is one line.");
Console.WriteLine(Builder);
Builder.Insert(0, "Begin");
Console.WriteLine(Builder);
Builder.Remove(19, Builder.Length - 19);
Console.WriteLine(Builder);
Builder.Replace("Begin", "Begin:");
Console.WriteLine(Builder);
Console.ReadLine();
}
}
}
输出:
可变字符串类StringBuilder和String的区别
每次使用String类的方法时,都要在内存中创建一个新的字符串对象,需要为该对象分配新的空间。在需要对字符串执行重复修改的情况下系统开销可能非常昂贵。如果要修改字符串而不创建新的对象,请使用StringBuilder类,避免产生过多临时对象。