C#中字符串处理(三)
字符与字符串的操作
1)字符与字符串之间的关系
char c = 'a';
string s = "baotiantiantian";
s = "tian";//重新赋值,而不是将s[0]="t",s[1]="i"这样的来改变。
// s[2] = 'b';//在数组中是可以改的,但在这里他是字符串是不能改变的,这里的做法是错误的;
c=s[0];// 字符可以改变,但字符串不能改变;
Console.WriteLine(s.Length);//通过length来查看字符串的长度;
Console.WriteLine(s[0]);//c#中用string来定义字符串,但是一旦定义了字符串后,字符串就不能改变;
注:c中的字符转长度等与他本省长度加1,后面还有个“\
2)“改变”字符串
string s = "bao";
string cs = s;// cs现在指向的是“bao”而不是s;
char[] chang = s.ToCharArray();//将s中的字符串复制到chang这个数组中去;
chang[2]='C';
s = new string(chang);
Console.WriteLine(s);// 改变的是s的指向,他指向chang字符数组了(chang数组是复制了s原先的那个指向(“baowenwei”)的值,然后对他进行改变(数组可以改变里面的值))。
Console.WriteLine(cs);//“baowenwei”始终没有改变。
说明: 1.这种方法是先将s的值复制到外面去,然后改变它的值,然后再对s从新赋值,这里这一步 s = new string(chang);就像是s="baCwenwei"一样,重新赋值;重新赋值和改变是两个不同的概念,就好型“baowenwei”是用一个字符串盒子装着,因为是用字符串盒子装着所以不能改变他里面的内容,然后我们将他复制出来,用数组来装下这个盒子,然后再对数组改变。
2. s开始指向的是装“baowenwei”这个盒子,通过上面语句s = new string(chang);将s重新指向了chang这个数组盒子。他是重新指向了,不是说他改变了。
3.可以看string cs = s;cs指向的是“baowenwei”而不是s,所以当s改变指向的时候(他重新指向了chang这个盒子)cs并没有改变,我们看到的屏幕上打印了s改变了,但装“baowenwei”原来这个盒子里面的内容是没有改变的,改变的只是被复制除去的那个值,改变后再让s的指向也跟着改变。实际上我们是没有动过装“baowenwei”这个盒子里面的内容的通过打印cs可以看出他的值没有改变;
3)大小写字符之间的转换
string d = "BAO";
string D = d;// D不是指向d,而是指向“BAO”。
d = d.ToLower();//大写转小写;
Console.WriteLine("原来的值{0}",D);// 原来的值没变;
Console.WriteLine("并未改变{0}只是重新指向了{1}而已",D,d);// d只是从新指向了。并没有改变原来的那个值;
d = d.ToUpper();//小写转大写;
Console.WriteLine(d);
注意:这里不是改变原来的大写(BAO),而是将原来的大写字符转换成小写,然后重新放在一个盒子里面,而不是改变原来的那个值。不是说字符串不能改变的吗?要知道d.ToLower()的返回值又是一个新值了,并不代表“BAO”改变了。可以通过打印D说明他是没有改变的;
4)去除字符串之间的空格
用Trim()方法去除空格;但是只能去除字符串两端的,字符中间的空格不能去除。
string k = " bao ";
string kk = k;
k = k.Trim();//去除k字符串两端的空格
Console.WriteLine("去除空格的{0}",k);
Console.WriteLine("原来的值{0}并未改变",kk);
5)比较两个字符串的大小
(1)Equals(被比较字符串)方法,判断两个字符串是否相等,相等则返回true,否则返回false;
Equals()可以有两个参数,第二个是用来两个字符串的比较的一些规则;如:StringComparison.OrdinalIgnoreCase是两个字符串比较时不区分字符串的大小写。
(2)CompareTo(被比较的字符串),比较字符串的大小。
string zf1 = "bao";
string zf2 = "Bao";
//bool b=(zf1==zf2);//区分大小写的比较可以直接用==,
bool b = zf1.Equals(zf2,StringComparison.OrdinalIgnoreCase);// 不区分大小写比较,由于是bool类型,相等则返回TRUE,不等返回FALSE;
Console.WriteLine(b);
//int i = "bao".CompareTo("wen");//比较两个数的大小,bao大于wen则返回1,小则返回-1,等于则返回0;
6)分割字符串(split)
StringSplitOptions.RemoveEmptyEntries去除空值;
(1)一般分割
string fg = "bao,wen,wei.tianxia|kunming";
string[] fgs = fg.Split(',','.','|');// 就是说当遇到“,. |”时,fg就成一个字符串。这里的话可以分割成5个字符串,然后放在fgs数组里面。
foreach (string ss in fgs)
{
Console.WriteLine(ss);
}
注意:split里面值用单引号(‘’)不要写成双引号了。
(2)分割后不要空值
string kg = "bao,,wen,,tianxia";
string[] kgs = kg.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);// 这种做法是如果分割中有,,不要返回空值。
//string[] kgs = kg.Split(','),这样也可以,但是kg里面有两个逗号,当分割后两个逗号之间是一个空值,这个空值也赋值给kgs这个数组,我们不想要空值就可以通过下面发方法来做分割。
//string[] kgs = kg.Split(',', StringSplitOptions.RemoveEmptyEntries);//不能这么写,因为后面这一陀stingspltoptions.……是返回无空格的数组,所以全面那么必须用数组;
//new char[]{','};这个是新建一个字符串数组的意思,然后这个数组的元素为“,”;
foreach (string kkgg in kgs)
{
Console.WriteLine(kkgg);
}
(3)通过字符串分割
string zfc = "我是宇宙人之我是中国人我是地球人。";
string[] zfcs = zfc.Split(new string[]{"我是"},StringSplitOptions.RemoveEmptyEntries);// 分割符为字符串;
foreach (string zfcss in zfcs)
{
Console.WriteLine(zfcss);
}
7)字符串替换
sss.Replace(参数一,参数二);将sss中的参数一用参数二替换掉。
string s1 = "地球美国";
s1 = s1.Replace("地球","美国");
Console.WriteLine(s1);
8)截断字符串
Substring(int参数)从第“参数”个字符开始截断,如:Substring(2)从第2个字符截断,在第二字符之前的就不要了。
string s2 = "baoensubstiingsfsdf";
s2 = s2.Substring(9);// 从第九个字符到最后一个字符截断;
Console.WriteLine(s2);
s2 = s2.Substring(2,4);// 从第2个字符截断向后截取4个字符;
Console.WriteLine(s2);
注意:如果是两个参数的截断最后一个参数的值不能超出截断字符串的总长度;
9)字符串内容的一些判断
bool Contains(string value) 判断字符串中是否含有子串value;
bool StartsWith(string value) 判断字符串是否以子串value开始;
bool EndsWith(string value) 判断字符串是否以子串value结束;
int IndexOf(string value) 取子串value第一次出现的位置并返回子串所在的位置;
bool类型返回值为TRUE,和FALSE;
注意:上面这几个都要用字符串名来对象。如s1.Contain(这里的值用来判断s1的内容);
例1:判断是否含有子串?
string s3 = "你这个傻B";
if (s3.Contains("傻B") || s3.Contains("中国垃圾"))
{
Console.WriteLine("请重新输入,因为你的输入有敏感词汇");
}
else
{
Console.WriteLine(s3);
}
例2:判断是否以子串value开始
string s4 = "http://baowei";
if (s4.StartsWith("http://") || s4.StartsWith("https://"))
{
Console.WriteLine("这个是网站");
}
else
{
Console.WriteLine("这不个是网站");
}
例3:判断子串第一次出现的位置
string email = "8222@qq.com";
int i = email.IndexOf("@");
string emailf = email.Substring(0,i);
string emaill = email.Substring(i+1);
Console.WriteLine("你用户名为:{0}",emailf);
Console.WriteLine("你的域名为:{0}",emaill);
10)地位字符串
string str = "abcd";
int m1 = str.IndexOf("b");
int m2 = str.IndexOf("c");
int m3 = str.IndexOf(" ");
int m4 = str.IndexOf("d");
Response.Write(m1.ToString()+"<br>");
Response.Write(m2.ToString()+"<br>");
Response.Write(m3.ToString()+"<br>");
Response.Write(m4.ToString()+"<br>");
Indeof为定为字符函数:从已有字符中计数(从0开始),定义的字符串中没有的字符用-1表示。空字符用0表示。以上运行结果为:1 2 -1 3
11).字符转化
string str = string.Format("(c) currency:{0:c}\n",
string str1 = string.Format("(d) short date:{0:d}\n" , DateTime.Now);
Response.Write(str.ToString()+"<br>");
Response.Write(str1.ToString());
格式为:string format(string object)
结果为:
(c) currency:¥-123.45
(d) short date:
12)字符串综合练习
练习2:查找文件中是否有“端口”这两个字,如果有就将他的值给打印出来。
c.txt文件内容如下:
adfadf=10
baowen=12
etan=21
端口=15
static void
{
string s = GetConfig(@"d:\我的文档\桌面\c.txt", "端口");//调用下面的自定义函数
Console.WriteLine(s);
}
static string GetConfig(string filename, string isname)
{
string[] lines = System.IO.File.ReadAllLines(filename,Encoding.Default);
foreach (string line in lines)
{
string[] str1 = line.Split('=');
string name = str1[0];
string jieguo=str1[1];
if (name.Trim() == isname)//name.Trim()是去除neme中的空格
{
return jieguo;
}
}
return "没有找到";
}
注:通过上面的例子和所调用的字符串方法可以看出,字符串也是对象,所以上面的方法是通过需要字符串的调用来使用的。如:string name=”adfadfad ”; name.Trim();name调用了Trim()这个方法来去除name字符串中的空格。