Keep on going never give up.

Let's Go

C# 学习笔记(10)字符串常用操作

C#Lonely2019-04-27 17:14:5651次0条

比较常用的对字符串进行操作的方法:

判断字符串是否为空

判断字符串是否以xx开头或结尾

字符串的修剪

字符串的替换

字符串的截取

字符串的删除(移除)

字符串的分割

字符串的合并

字符串的查找

字符串的格式化

字符串的复制

字符串的插入与填充

字符串的比较


暗锚,解决锚点偏移 ● 判断字符串是否为空

string.IsNullOrEmpty() 指示指定的字符串是 null 还是 Empty 字符串。

string.IsNullOrWhiteSpace() 指示指定的字符串是 null、空还是仅由空白字符组成。

IsNullOrEmpty IsNullOrWhiteSpace
null true true
string.Empty true true
"" true true
"      " false true

string.IsNullOrEmpty方法无法判断空字符串和带有换行符的字符串,所以string.IsNullOrWhiteSpace方法的功能要更完善,而且 string.IsNullOrWhiteSpace方法的性能要更高。

代码示例:

string str = string.Empty;
string str0 = null;
string str1 = "";
string str2 = "      ";

//IsNullOrEmpty
if (string.IsNullOrEmpty(str))
    Console.WriteLine("是为空"); //被输出了
else
    Console.WriteLine("不为空");
if (string.IsNullOrEmpty(str0))
    Console.WriteLine("是为空"); //被输出了
else
    Console.WriteLine("不为空");
if (string.IsNullOrEmpty(str1))
    Console.WriteLine("是为空"); //被输出了
else
    Console.WriteLine("不为空");
if (string.IsNullOrEmpty(str2))
    Console.WriteLine("是为空"); 
else
    Console.WriteLine("不为空");//被输出了
    
//IsNullOrWhiteSpace
if (string.IsNullOrWhiteSpace(str))
    Console.WriteLine("是为空"); //被输出了
else
    Console.WriteLine("不为空");
if (string.IsNullOrWhiteSpace(str0))
    Console.WriteLine("是为空"); //被输出了
else
    Console.WriteLine("不为空");
if (string.IsNullOrWhiteSpace(str1))
    Console.WriteLine("是为空"); //被输出了
else
    Console.WriteLine("不为空");
if (string.IsNullOrWhiteSpace(str2))
    Console.WriteLine("是为空"); //被输出了
else
    Console.WriteLine("不为空");
    
Console.ReadKey();


暗锚,解决锚点偏移 ● 判断字符串是否以xx开头或结尾

代码示例:

string str = "只有看着别人的故事才能忘记自己的故事";
//判断字符串是否以xx开头
if (str.StartsWith("只有"))
    Console.WriteLine("是以只有开头"); //被输出了
else
    Console.WriteLine("不是以只有开头"); 
              
//判断字符串是否以xx结尾
if (str.EndsWith("故事"))
    Console.WriteLine("是以故事结尾"); //被输出了            
else
    Console.WriteLine("不是以故事结尾");  
              
Console.ReadKey();


暗锚,解决锚点偏移 ● 字符串的修剪

字符串的修剪,修剪即为Trim,用于删除字符串头尾出现的某些字符。

c#中有三个修剪字符串的方法:

(1)、字符串.Trim(); 作用:删除字符串首部和尾部的空格。

代码示例:

string str = "             春夏秋冬                ";
Console.WriteLine("原字符是:\n【"+str +"】");
Console.WriteLine("修剪后的字符:\n【"+str .Trim() + "】");

运行结果:

image.png

(2)、字符串.TrimStart(); 作用:只删除字符串头部的空格。

代码示例:

string str = "             春夏秋冬                ";
Console.WriteLine("原字符是:\n【"+str +"】");
Console.WriteLine("修剪后的字符:\n【"+str .TrimStart() + "】");

运行结果:

image.png

(3)、字符串.TrimEnd(); 作用:只删除字符串尾部的空格

代码示例:

string str = "             春夏秋冬                ";
Console.WriteLine("原字符是:\n【"+str +"】");
Console.WriteLine("修剪后的字符:\n【"+str .TrimEnd() + "】");

运行结果:

image.png

(4)、字符串.Trim(需要修剪的字符1,需要修剪的字符2,需要修剪的字符……字符n);

代码示例:

string str = "*%$#春夏秋冬#$%*";
Console.WriteLine("原字符是:\n" + str );
Console.WriteLine("修剪后的字符:\n" + str.Trim('*','%','#', '$'));

运行结果:

image.png

(5)、字符串.Trim("包含所有要修剪的字符串".ToCharArray());

代码示例:

string str1 = "*%$#春夏秋冬@#$%*";
Console.WriteLine("原字符是:\n" + str1);
Console.WriteLine("修剪后的字符:\n" + str1.Trim("#%$*@".ToArray()));

运行结果:

image.png


暗锚,解决锚点偏移 ● 字符串的替换

字符串的替换是通过Replace来实现的,语法:字符串.Replace(要替换的原字符串,替换后的字符串);

代码示例:

string str = "hello,world!";
Console.WriteLine("原字符串:"+str);
Console.WriteLine("替换后的字符串:"+ str.Replace('h', 'H'));

//例屏蔽指定字符
string str1 = "政府机关泄密";
if (str1.Contains("政府")) //判断字符串中是否含有子串value
    str1 = str1.Replace("政府", "**"); //替换字符            
Console.WriteLine(str1);
Console.ReadKey();

运行结果:

image.png


暗锚,解决锚点偏移 ● 字符串的截取

方法一:字符串.Substring(整数n);  作用:将字符串前n个长度的字符串(n下标由0开始)截取掉,保留后面的字符串。

方法二:字符串.Substring(整数n,整数m); 作用:保留从字符串第n个长度开始数m个长度的字符串(n下标由0开始)。

这两种重载格式都会返回一个新的字符串。

代码示例:

//例:采用这两种重载方法对字符串“0123456789”进行截取
string str = "0123456789";
string mystr = str.Substring(3); //从0开始数字符串,第3位开始截取,保留后面的字符串
Console.WriteLine(mystr); //输出3456789

string mystr2 = mystr.Substring(3,4); //从0开始数字符串,第3位开始截取,保留4位字符串
Console.WriteLine(mystr2); //输出3456


暗锚,解决锚点偏移 ● 字符串的删除(移除)

字符串的删除是通过Remove来实现的。

方法一:字符串.Remove(开始位置);作用:将字符串开始位置后的所有字符删除。注:这里的开始位置是指字符串的索引,从下标0开始数。

法二:字符串.Remove(开始位置,移出数);作用:从开始位置数到移出数的位置的字符删除。注:这里的开始位置是指字符串的索引,从下标0开始数。

代码示例:

string str = "www.qbl.link#ABCDEFG";
string mystr = str.Remove(12); 
Console.WriteLine(mystr); //输出www.qbl.link
string mystr1 = str.Remove(12,8); 
Console.WriteLine(mystr1); //输出www.qbl.link


暗锚,解决锚点偏移 ● 字符串的分割

分割字符串语法:字符串.Split(括号里填字符或字符数组);

代码示例:

//例1:
string str = "Q-Blog#www.qbl.link#欢迎来访";
Console.WriteLine("原字符串为:" + str);
Console.WriteLine("分割后的字符串为:");
string[] mystr = str.Split('#');
 foreach (string s in mystr)
{
    Console.Write(s+ "\t");
}

运行结果:

image.png

//例2:
string str1 = "往事已成空,还如一梦中。《子夜歌》";
Console.WriteLine("原字符串为:" + str1);
Console.WriteLine("分割后的字符串为:");
string[] mystr1 = str1.Split(new char[] { ',','。'});
foreach (string s in mystr1)
{
    Console.Write(s + "\t");
}

运行结果:

image.png

//例3:分割字符串后,char数组不包含空字符串
string s = "A++B--C=D";
char[] arr = { '+', '-', '=' };//要分割的字符
string[] strArr = s.Split(arr, StringSplitOptions.RemoveEmptyEntries);
foreach (string temp in strArr)
{
    Console.Write(temp);
}
Console.ReadKey();

image.png


暗锚,解决锚点偏移 ● 字符串的合并

字符串合并的三种方法:

方法一:+连接

方法二:Concat语法:string.Concat(字符串1,字符串2,字符串3……字符串n);

方法:Join语法:string.Join(合并后的分割符,字符串数组);

代码示例:

string str1 = "茫茫人海中, ";
string str2 = "错过了该错过的,放弃了该放弃的, ";
string str3 = "于是,终于等到了你。";

//方法一:+连接
string mystr1 = str1 + str2 + str3;
Console.WriteLine("方法一(+):"+mystr1);

//方法二:Concat语法:string.Concat(字符串1,字符串2,字符串3……字符串n);
string mystr2 = string.Concat(str1, str2, str3);
Console.WriteLine("方法二(Concat):"+mystr2);

//方法三:Join语法:string.Join(合并后的分割符,字符串数组);
string[] strArr = { str1, str2, str3 };
string mystr3 = string.Join("",strArr);
Console.WriteLine("方法三(Join):" + mystr3);
Console.ReadKey();

运行结果:

image.png


暗锚,解决锚点偏移 ● 字符串的查找

字符串的查找是通过IndexOf和LastIndexOf这两个方法来实现的。两个方法均返回一个整数,如果要查找的字符串内,不包含要查找的字符换字符串,则返回一个负数。

代码示例:

//IndexOf语法:字符串.IndexOf(要查找的字符或字符串);
//返回要查找的字符或字符串第一次在所要查找的字符串中出现的位置(下标从0开始索引)。
string str = "得之我幸,失之我命,如此而已。";
int num = str.IndexOf('此');
Console.WriteLine(num); //输出11

//LastIndexOf语法:字符串.LastIndexOf(要查找的字符或字符串);
//返回要查找的字符或字符串最后一次在所要查找的字符串中出现的位置。
int index = str1.LastIndexOf('我');
Console.WriteLine(index); //输出7
Console.ReadKey();


暗锚,解决锚点偏移 ● 字符串的格式化

string.Format(); //有多种重载,这里只列举两个,有需要自己查看。

string.Format(要转换的格式,格式化的对象);

string.Format(要转换的格式, 格式化的对象一, 格式化对象二);

代码示例:

//例:通过字符串Format方法对2100和2100.33进行格式化并输出转化后的结果
Console.WriteLine("字符串的格式化输出");
string mystr = string.Format("默认格式:{0}\n"+ "使用C格式:{0:C}\n"+ "使用D格式:{0:D}\n" + "使用E格式:{1:E}\n" + "使用F格式:{1:F}\n" + "使用G格式:{0:G}\n" + "使用N格式:{0:N}\n" + "使用P格式:{0:P}\n" + "使用X格式:{0:X}\n",2100,2100.33);
Console.WriteLine(mystr);
string str = string.Format("{0:C}",2100);
Console.WriteLine(str );

Console.WriteLine("输出001-050:");
for (int i = 1; i < 51; i++)
{    
    Console.WriteLine("{0:D3}",i); //也可以直接写到输出语句上   
}
Console.ReadKey();

运行结果:

image.png


暗锚,解决锚点偏移 ● 字符串的复制

C#中字符串的复制是通过Copy和CopyTo来实现的。

方法一:Copy:string.Copy(需要复制的字符串); //静态方法

方法二:CopyTo:字符串变量名.Copy(要复制字符的起始位置,目标字符数组,目标字符数组中的开始存放位置,要复制的字符个数); //非静态方法

代码示例:

//方法一:
string str = "http://www.qbl.link";
string mystr = string.Copy(str);
Console.WriteLine(mystr); //输出http://www.qbl.link
   
//方法二:     
char[] arr = new char [12];
str.CopyTo(7, arr , 0, 12);
Console.WriteLine(arr); //输出www.qbl.link
Console.ReadKey();


暗锚,解决锚点偏移 ● 字符串的插入与填充

字符串的插入语法:字符串.Insert(插入位置,插入子串);注:这里的插入位置指的是索引值,下标由0开始数。

字符串的填充:填充是通过PadRight(填充右边)和PadLeft(填充左边)实现的。

代码示例:

//字符串的插入
string str = "Hello,world";
string insertStr = str.Insert(11, "!!!"); //输出Hello,world!!!
Console.WriteLine(insertStr );
           
//字符串的填充:
//填充是通过PadRight(填充右边)和PadLeft(填充左边)实现的。
//PadRight方法是在字符串的结尾,通过添加指定的重复字符填充字符串。
//PadRight语法:
//字符串.PadRight(总长度); //以空格填充。
//字符串.PadRight(总长度,要填充的char字符);
string myStr1 = "六六六";
string myStr2= "八八八八八";
string myStr3= "九九九九九九九";
string padRightStr = myStr1 .PadRight(8, '填')+"\n"+ myStr2.PadRight(8, '填') + "\n" + myStr3.PadRight(8, '填');
Console.WriteLine(padRightStr);

//PadLeft方法是在字符串的开头,通过添加指定的重复字符填充字符串。
//PadLeft语法:
//字符串.PadLeft(总长度); //以空格填充。
//字符串.PadLeft(总长度,要填充的char字符);
string padLeftStr = myStr1 .PadLeft(13) + "\n" + myStr2.PadLeft(11) + "\n" + myStr3.PadLeft(9);
Console.WriteLine(padLeftStr );
Console.ReadKey();

运行结果:

image.png


暗锚,解决锚点偏移 ● 字符串的比较

string.Equals(); //多种重载

string.Compare(); //字符串大小比较函数,该函数有多种重载

代码示例:

//Equals方法,这里只列举两个。
//string.Equals(字符串1,字符串2) 返回布尔值
string s1 = "hello";
string s2 = "hi";
Console.WriteLine(string .Equals(s1,s2)); //输出False

//忽略大小写进行比较
string str1 = "c#";
string str2 = "C#";
if (str1.Equals(str2, StringComparison.OrdinalIgnoreCase))
{
    Console.WriteLine("输入的字符串相同"); //被输出了
}


//Compare方法,这里只列举两个。
//string.Compare(字符串1,字符串2)
Console.WriteLine(string.Compare(s1, s2)); //输出了-1

//string.Compare(字符串1,字符串2,布尔值) 返回一个整数
//返回的整数小于0,字符串1<字符串2
//返回的整数等于0,字符串1=字符串2
//返回的整数大于0,字符串1>字符串2
//布尔值为true时,忽略大小写进行比较
Console.WriteLine(string.Compare(s1, s2,true)); //输出了-1

//CompareTo方法
//字符串1.CompareTo(字符串2)
//返回的整数小于0,字符串1<字符串2
//返回的整数等于0,字符串1=字符串2
//返回的整数大于0,字符串1>字符串2,或字符串2为null引用。
Console.WriteLine(s1.CompareTo(s2)); //输出了-1

Console.ReadKey();

问:== 和 equals的区别是什么?

答: 

1、值类型的比较

对于值类型来说  两者比较的都是“内容”是否相同,即  是否一样,很显然此时两者是划等号的。

//例:
int i = 10;
int j = 10;
Console.WriteLine("值类型Equals和= =(等于号)的比较:");
Console.WriteLine("i==j 输出:" + (i == j)); //输出True
Console.WriteLine("i.Equals(j) 输出:" + i.Equals(j)); //输出True

结论:对于值类型来说  两者是相同的 都是比较的变量的值


2、引用类型的比较

对于引用类型来说,等号(==)比较的是两个变量的“引用”是否一样,即引用的“地址”是否相同。而对于equals来说仍然比较的是变量的 “内容”是否一样。

(1)、字符串的比较

//对于string字符串的比较
string s1 = "abc";
string s2 = "abc";
Console.WriteLine("引用类型Equals和= =(等于号)的比较:");
Console.WriteLine("s1==s2 输出:" + (s1 == s2)); //输出True
Console.WriteLine("s1.Equals(s2) 输出:" + s1.Equals(s2)); //输出True

是不是感到疑问?上面说的 ==号是比较两个引用类型的变量的引用地址是否一致,但是上面的s1 和s2是两个不同的变量,为何比较的输出是true呢?

 原因是:由于string是微软封装的一个字符串类,在内部他已经对 == 操作符进行了重写。重写后他比较的则是两个变量的内容是否相同,即重写后的 == 操作符内部调用的还是 equals 方法,所以输出的是true。

(2)、 自定义的其他引用类型 —— person类为例

Person p1 = new Person("小明", "男");
Person p2 = new Person("小明", "男");
Console.WriteLine("引用类型Equals和= =(等于号)的比较:");
Console.WriteLine("p1==p2 输出:" + (p1 == p2)); //输出False
Console.WriteLine("p1.Equals(p2) 输出:" + p1.Equals(p2)); //输出False

对于 p1==p2 比较的结果为False,这点是毫无疑问的,因为他俩是两个不同的变量,所以引用的地址也是不同的。但是对于p1.Equals(p2) 返回False,可能有人会产生疑问,p1 和p2的内容是相同的啊,为什么他俩的比较结果却是为False呢?原因就在于在Equals是Object中的一个虚方法,而person类中没有对它进行重写,因此此时调用的仍是父类中的Equals方法。但是父类是无法知道你都有哪些成员字段的,因此返回的是False。要想让它能够比较两个变量的内容是否相同,那就应该重写Equals方法,代码如下:

public override bool Equals(object obj)
{
    Person p = obj as Person;
    //对变量的所有的属性都要进行比较,只有都相同时才返回true。
    if (this.Name == p.Name && this.Sex == p.Sex)
        return true;
    else
        return false;
}

结论:Equals比较的永远是变量的内容是否相同,而==比较的则是引用地址是否相同(前提:此种类型内部没有对Equals 或== 进行重写操作,否则输出可能会有所不同,如:string 类型是个特例,因为它的内部对这两个都进行了重写)。


问:Compare方法与CompareTo方法字符串大小比较的原理是什么?

答:从两个字符串的第一个字符开始逐个进行比较(按字符的ASCII值进行大小比较),直到出现不同的字符或遇到‘\0’为止。如果全部字符都相同,就认为两字符串相等,返回0;若出现了不相同的字符,则以第一个不相同的字符比较结果为准,若前者字符大于后者,则返回1,否则返回-1.

注意:顺序是第一个对象与第二个对象比较!

  前>后 return 1;

  前=后 return 0;

  前<后 return -1

CompareTo方法与Compare方法实现的功能是一样的,只是参数的位置放的不一样而已。




暗锚,解决锚点偏移

文章评论

    嘿,来试试登录吧!