今天学习了一部分C#中的字符串知识和一些正则表达式的知识,感觉不是很难,在此分享一下,如有不足之处,欢迎各位大佬批评指正。
首先写一下,string和StringBuilder的一些区别。
string s="优快云";这里面s是一个定义好的字符串变量,不能更改,因为字符串"优快云"是一个已经存储在内存堆上的一个数据了,而s只是一个存在栈上的变量,通过调用变量s来指向堆上的那块数据。如果我们使用s="ABC"+s;这个语句,相当于在内存堆上重新建立了一个存储空间,将字符串"优快云"拷贝到新空间并为其添加"ABC"字符串,然后将s变量的指向指到新开辟的堆内存上,而以前建立的“优快云”字符串还存在于堆内存中,等待系统的垃圾回收程序将其销毁。
而StringBuilder建立的变量,是可以进行改变的。首先,我们定义一个StringBuilder str=new StringBuilder("www.优快云.com", 50);这里我们发现,StringBuilder是一个类的变量,我们需要使用new的构造函数为其进行初始化。而在初始化时,我们可以去定义它的初始值,和最大值。另外在对变量str进行改变时,我们需要使用str.Append()函数,通过这个方法,可以将()内的字符串添加到原有的str字符串后面。而这个过程不同于string类的地方在于,他不需要重新建立一块存储空间,只需要在构造str时,创建的空间中直接添加()中的字符即可(当然,创建的空间要足够大,可以放下()中的字符串)。
通过上述过程我们发现,在进行添加字符串函数的过程中,StringBuilder类要比string类更有效率一点。另外,string只不过是System.String的别名,他同样也是个类。
下面记录一下,关于正则表达式的一些心得。
正则表达式是非常常用的一个检测字符串是否匹配的方法。其中定义了一些常用的字符。例如"^"符号,代表字符串的开头,"$"符号代表字符串的结尾,\d代表匹配数字[0-9],"*"代表匹配上一个元素零次或多次,“+“则代表匹配上一个元素一次。"{n}"代表匹配上一个元素n次,而"{n,m}"则代表匹配上一个元素n到m次。说到这,肯定大部分人都懵逼了,下面我写一些简单的例子,希望能帮助大家理解。
例子1:
string s = Console.ReadLine();//读取用户输入的一行字符串
string pattern = @"^\d*$";//然后我们定义一个正则表达式,在该字符串前加一个"@"就是告诉编译器,这些特殊字符是作为字符串中的一部分存在的,编译器就不会去编译它了。字符串当然要用""括起来。^表示开头要匹配他后面的\d(也就是数字[0-9]),中间的*是告诉表达式,可以匹配0个或者多个。而最后用"$"符号结尾,则说明最后也要匹配\d。
bool isMatch = Regex.IsMatch(s, pattern);//然后我们使用IsMatch方法来判定是否匹配,返回一个bool值
Console.WriteLine(isMatch);//最后输出一下结果,如果相同返回true,不同就是false;
由上面的例子,我们大致了解了正则表达式的用法,那如何限定我想要限定的特殊字符呢?下面我们讲另一个例子:
例子2:
string str = "abcdefghijklmnopqrstuvwxyz.";//定义一个字符串,直接使用26个字母吧
string pattern = @"[abc]";//这句话的意思是他匹配中括号中的任意一个字符,就是其中的abc三个字母,每一个他都可以匹配为真
string s=Regex.Replace(str, pattern, "*");//我们使用替换函数Replace,将匹配的字符使用*代替。
Console.WriteLine(s);//输出结果
我们发现字符串中的abc都被替换了。中括号表示其中任意一个符号匹配成功,都算匹配成功
下面,我们将正则表达式改为
string pattern =@"[a-e]";
则输出结果为:
我们发现a到e都被替换了,那么表达式[a-e]就是代表a到e之间所有的字符都匹配这个表达式。
最后,我们将正则表达式改为
string pattern =@"[^a-e]";
则输出结果为:
我们发现除了abcde以外,其它字母全部都被替换了。也就是说符号"^"在这里还有另外一个取反的意思。
最后我们再举例子说明一下大括号{}和逻辑运算符|在正则表达式中的用法。
例子3:
string s = Console.ReadLine();//我们手动输入一行数字
string pattern = @"^\d{5,12}$";通过正则表达式来判断他是不是一个合格的QQ号,其中{5,12}代表最小QQ号的位数,和最大QQ号的位数,我们需要正则表达式循环匹配5-12次,所以我们将次数使用{}限制出来;
bool isMatch = Regex.IsMatch(s, pattern);
Console.WriteLine(isMatch);
我分别输入了3次,大家可以发现,无论我是输入的数字长度超出范围或者输入的字符中包含字母,都无法使正则表达式为真。只有输入的数字完全符合我们的限制条件时,返回的结果才为真。
例子4:
string s = "zhangsan;lisi,wangwu.zhaoliu";//定义一组使用不同符号分割开的人名字符串
string pattern = @"[;]|[,]|[.]";//分别使用"|"运算符,将判定条件使用逻辑语言与(and);
string[] resArray = Regex.Split(s, pattern);//将分割完成的字符串使用一个字符串数组存储。
foreach (var s1 in resArray)//使用foreach函数遍历数组元素。
{
Console.WriteLine(s1);
}
输出结果为:
大家发现,我们已经根据不同的符号将每个字符串分割开了。
以上就是我学习C#字符串过程中的一点心得和体会,希望与大家分享,共同进步!同时也欢迎大佬来给我等小白,指出错误和不足之处。每个网友的评论都是我前进道路上的动力!