字符串常用成员:
string str = Console.ReadLine();
str.Length; //获取字符串的长度
str[0]; str[str.Length - 1]; //字符串中的第一个字符和最后一个字符
str.IndexOf("@") ; //得到的是指定字符串在原字符串中第一次出现的位置,
str.LastIndexOf("@"); //LastlndexOf 方法得到的是指定字符串在查找的字符串中最后一次出现的位置。
str.Replace(",", "_"); //将字符串中所有的‘,’替换成‘_’。
str.Insert(1, "@@@"); //将‘@@@’插入到字符串的第 2 个字符的位置。
Substring(指定位置); //从字符串中的指定位置开始截取到字符串结束
Substring(指定位置, 截取的字符的个数); //从字符串中的指定位置开始截取指定字符个数的字符
截取字串:
string str = Console.ReadLine();
int firstIndex = str.IndexOf("@");
int lastIndex = str.LastIndexOf("@");
if(firstIndex != -1 && firstIndex == lastIndex)
{
str = str.Substring(0, firstIndex);
}
Console.WriteLine("邮箱中的用户名是:" + str);
数据转换:
//隐式转换主要是在整型、浮点型之间的转换,将存储范围小的数据类型直接转换成存储范围大的数据类型。
//例如将 int 类型的值转换成 double 类型的值,将 int 类型的值转换成 long 类型的值,或者将 float 类型的值转换成 double 类型的值。
int a = 100;
double d = a; //将int类型转换为double类型
float f = 3.14f;
d = f; //将float类型转换为double类型
//强制类型转换主要用于将存储范围大的数据类型转换成存储范围小的,但数据类型需要兼容。
//例如 int 型转换成 float 型是可行的,但 float 型转换成 int 型则会造成数据精度丢失,而且字符串类型与整数类型之间是无法进行强制类型转换的。
数据类型 变量名 = (数据类型) 变量名或值;
double dbl_num = 12345678910.456;
int k = (int) dbl_num ;//此处运用了强制转换
//C# Convert方法:数据类型转换
float num1 = 82.26f;
int integer;
string str;
integer = Convert.ToInt32(num1);
str = Convert.ToString(num1);
Console.WriteLine("转换为整型数据的值{0}", integer);
Console.WriteLine("转换为字符串{0},",str);
Parse 方法:
//C# Parse 方法用于将字符串类型转换成任意类型,具体的语法形式如下。
数据类型 变量 = 数据类型.Parse(字符串类型的值);
int num1 = int.Parse(Console.ReadLine());
C#装箱和拆箱(值类型和引用类型):
//C# ToString 方法用于将任意的数据类型转换成字符串类型,例如将整数类型转换成字符串类型。
int a=100;
string str=a.ToString(); //这样整型变量 a 即可被转换成字符串类型。
//在 C# 语言中数据类型分为值类型和引用类型,将值类型转换为引用类型的操作称为装箱,相应地将引用类型转换成值类型称为拆箱。
//在上面的转换中 int 类型是值类型,而 string 类型是引用类型,当将值类型变量 a 的值转换成引用类型变量 str 时就是一个装箱的操作,
// 而拆箱操作则是将引用类型变量 str 的值再转换成整型的过程,转换的代码如下。
a=int.Parse(str); //这样就完成了一个简单的装箱和拆箱操作。
int val = 100;
object obj = val;
Console.WriteLine("对象的值 = {0}", obj); //这是一个装箱的过程,是将值类型转换为引用类型的过程
int val = 100;
object obj = val;
int num = (int) obj;
Console.WriteLine("num: {0}", num); //这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程
正则表达式:
//在 Main 方法中从控制台输入一个邮箱,使用正则表达式判断其正确性:
//在本例中邮箱验证的正则表达式的写法是包含 @,在 @ 前面是字母或者数字、下画线,在 @ 后面也是字母或者数字、下画线,
//并且字母后面要含有.,在 . 后面还要加上字母或者数字、下画线。具体的代码如下。
Console.WriteLine("请输入一个邮箱");
string email = Console.ReadLine();
Regex regex = new Regex(@"^(\w)+(\.\w)*@(\w)+((\.\w+)+)$");
if (regex.IsMatch(email))
{
Console.WriteLine("邮箱格式正确。");
}
else
{
Console.WriteLine("邮箱格式不正确。");
}
编号 | 正则表达式 | 作用 |
---|---|---|
1 | \d{15}|\d{18} | 验证身份证号码(15位或18位) |
2 | \d{3}-\d{8}|\d{4}-\d{7} | 验证国内的固定电话(区号有3位或4位,并在区号和电话号码之 间加上-) |
3 | ^[1-9]\d*$ | 验证字符串中都是正整数 |
4 | ^-[1-9]\d*$ | 验证字符串中都是负整数 |
5 | ^-?[1-9]\d*$ | 验证字符串中是整数 |
6 | ^[A-Za-z]+$ | 验证字符串中全是字母 |
7 | A[A-Za-z0-9]+$ | 验证字符串由数字和字母构成 |
8 | [\u4e00-\u9fa5] | 匹配字符串中的中文 |
9 | [^\x00-\xff] | 匹配字符串中的双字节字符(包括汉字) |
在字符串操作中常用的属性或方法如下表所示。
编号 | 属性或方法名 | 作用 |
---|---|---|
1 | Length | 获取字符串的长度,即字符串中字符的个数 |
2 | IndexOf | 返回整数,得到指定的字符串在原字符串中第一次出现的位置 |
3 | LastlndexOf | 返回整数,得到指定的字符串在原字符串中最后一次出现的位置 |
4 | StartsWith | 返回布尔型的值,判断某个字符串是否以指定的字符串开头 |
5 | EndsWith | 返回布尔型的值,判断某个字符串是否以指定的字符串结尾 |
6 | ToLower | 返回一个新的字符串,将字符串中的大写字母转换成小写字母 |
7 | ToUpper | 返回一个新的字符串,将字符串中的小写字母转换成大写字母 |
8 | Trim | 返回一个新的字符串,不带任何参数时表示将原字符串中前后的空格删除。 参数为字符数组时表示将原字符串中含有的字符数组中的字符删除 |
9 | Remove | 返回一个新的字符串,将字符串中指定位置的字符串移除 |
10 | TrimStart | 返回一个新的字符串,将字符串中左侧的空格删除 |
11 | TrimEnd | 返回一个新的字符串,将字符串中右侧的空格删除 |
12 | PadLeft | 返回一个新的字符串,从字符串的左侧填充空格达到指定的字符串长度 |
13 | PadRight | 返回一个新的字符串,从字符串的右侧填充空格达到指定的字符串长度 |
14 | Split | 返回一个字符串类型的数组,根据指定的字符数组或者字符串数组中的字符 或字符串作为条件拆分字符串 |
15 | Replace | 返回一个新的字符串,用于将指定字符串替换给原字符串中指定的字符串 |
16 | Substring | 返回一个新的字符串,用于截取指定的字符串 |
17 | Insert | 返回一个新的字符串,将一个字符串插入到另一个字符串中指定索引的位置 |
18 | Concat | 返回一个新的字符串,将多个字符串合并成一个字符串 |
C# 允许使用两种转换方式:隐式类型转换和显式类型转换。
常用的类型转换方法如下表所示。
方法 | 描述 |
---|---|
ToBoolean | 如果可能的话,把类型转换为布尔型。 |
ToByte | 把类型转换为字节类型。 |
ToChar | 如果可能的话,把类型转换为单个 Unicode 字符类型。 |
ToDateTime | 把类型(整数或字符串类型)转换为 日期-时间 结构。 |
ToDecimal | 把浮点型或整数类型转换为十进制类型。 |
ToDouble | 把类型转换为双精度浮点型。 |
ToInt16 | 把类型转换为 16 位整数类型。 |
ToInt32 | 把类型转换为 32 位整数类型。 |
ToInt64 | 把类型转换为 64 位整数类型。 |
ToSbyte | 把类型转换为有符号字节类型。 |
ToSingle | 把类型转换为小浮点数类型。 |
ToString | 把类型转换为字符串类型。 |
ToType | 把类型转换为指定类型。 |
ToUInt16 | 把类型转换为 16 位无符号整数类型。 |
ToUInt32 | 把类型转换为 32 位无符号整数类型。 |
ToUInt64 | 把类型转换为 64 位无符号整数类型。 |
隐式数值转换包括以下几种:
• 从 sbyte 类型到 short,int,long,float,double,或 decimal 类型。
• 从 byte 类型到 short,ushort,int,uint,long,ulong,float,double,或 decimal 类型。
• 从 short 类型到 int,long,float,double,或 decimal 类型。
• 从 ushort 类型到 int,uint,long,ulong,float,double,或 decimal 类型。
• 从 int 类型到 long,float,double,或 decimal 类型。
• 从 uint 类型到 long,ulong,float,double,或 decimal 类型。
• 从 long 类型到 float,double,或 decimal 类型。
• 从 ulong 类型到 float,double,或 decimal 类型。
• 从 char 类型到 ushort,int,uint,long,ulong,float,double,或 decimal 类型。
• 从 float 类型到 double 类型。
其中,从 int,uint 或 long 到 float 以及从 long 到 double 的转换可能会导致精度下降,但决不会引起数量上的丢失。其它的隐式数值转换则不会有任何信息丢失。
隐式数值转换实际上就是从低精度的数值类型到高精度的数值类型的转换。
C# Convert 方法是数据类型转换中最灵活的方法,它能够将任意数据类型的值转换成任意数据类型,前提是不要超出指定数据类型的范围。
具体的语法形式如下。
数据类型 变量名 = convert.To数据类型(变量名);
这里 Convert.To 后面的数据类型要与等号左边的数据类型相匹配。
Convert 类常用的类型转换方法如下表所示。
方法 | 说明 |
---|---|
Convert.ToInt16() | 转换为整型(short) |
Convert.ToInt32() | 转换为整型(int) |
Convert.ToInt64() | 转换为整型(long) |
Convert.ToChar() | 转换为字符型(char) |
Convert.ToString() | 转换为字符串型(string) |
Convert.ToDateTime() | 转换为日期型(datetime) |
Convert.ToDouble() | 转换为双精度浮点型(double) |
Conert.ToSingle() | 转换为单精度浮点型(float) |
对于整型和浮点型的强制数据类型操作也可以使用 Convert 方法代替,但是依然会损失存储范围大的数据类型的精度。
正则表达式的主要作用是验证字符串的值是否满足一定的规则,在页面输入数据验证方面的应用比较多。
例如验证输入的邮箱是否合法、输入的身份证号码是否合法、输入的用户名是否满足条件等。
正则表达式并不是 C# 语言独有的,在大多数的编程语言中都是支持的,包括一些脚本语言也支持,例如 JavaScript、JQucry 等。
正则表达式是专门处理字符串操作的,其本身有固定的写法。
正则表达式的符号主要分为元字符和表示重复的字符,分别如下表所示。
正则表达式中的元字符
编号 | 字符 | 描述 |
---|---|---|
1 | . | 匹配除换行符以外的所有字符 |
2 | \w | 匹配字母、数字、下画线 |
3 | \s | 匹配空白符(空格) |
4 | \d | 匹配数字 |
5 | \b | 匹配表达式的开始或结束 |
6 | ^ | 匹配表达式的开始 |
7 | $ | 匹配表达式的结束 |
正则表达式中表示重复的字符
编 号 | 字 符 | 描 述 |
---|---|---|
1 | * | 0次或多次字符 |
2 | ? | 0次或1次字符 |
3 | + | 1次或多次字符 |
4 | {n} | n次字符 |
5 | {n,M} | n到M次字符 |
6 | {n, } | n次以上字符 |
此外,在正则表达式中使用|
分隔符表示多个正则表达式之间的或者关系,也就是在匹配某一个字符串时满足其中一个正则表达式即可。
例如使用正则表达式来验证身份证信息,第一代身份证是由 15 个数字构成的,第二代身份证是由 18 个数字构成的,正则表达式可以写成 \d{15}|\d{18}
。
在 C# 语言中使用正则表达式时要用到 Regex 类,该类在 System.Text.RegularExpressions 名称空间中。
在 Regex 类中使用 IsMatch 方法判断所匹配的字符串是否满足正则表达式的要求。
【实例】在 Main 方法中从控制台输入一个邮箱,使用正则表达式判断其正确性。
根据题目要求,在本例中邮箱验证的正则表达式的写法是包含 @,在 @ 前面是字母或者数字、下画线,在 @ 后面也是字母或者数字、下画线,并且字母后面要含有.
,在 .
后面还要加上字母或者数字、下画线。具体的代码如下。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入一个邮箱");
string email = Console.ReadLine();
Regex regex = new Regex(@"^(\w)+(\.\w)*@(\w)+((\.\w+)+)$");
if (regex.IsMatch(email))
{
Console.WriteLine("邮箱格式正确。");
}
else
{
Console.WriteLine("邮箱格式不正确。");
}
}
}
邮箱的正则表达式也有多种写法,上面的写法只是其中的一种,例如将实例中的\w
替换成[a-zA-Z0-9_]
。
此外,在 Regex 类中还提供了很多方法来操作正则表达式
字符 | 描述 |
---|---|
\ | 转义字符,将一个具有特殊功能的字符转义为一个普通字符,或反过来 |
(pattern) | 匹配 pattern 并获取这一匹配 |
(?:pattern) | 匹配 pattern 但不获取匹配结果 |
(?=pattern) | 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串 |
(?!pattern) | 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串 |
x|y | 匹配x或y。例如,‘z |
[xyz] | 字符集合。匹配所包含的任意一个字符。例如,‘[abc]’可以匹配“plain”中的‘a’ |
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如,‘[^abc]’可以匹配“plain”中的‘p’ |
[a-z] | 匹配指定范围内的任意字符。例如,‘[a-z]’可以匹配’a’到’z’范围内的任意小写字母字符 |
[^a-z] | 匹配不在指定范围内的任意字符。例如,‘[^a-z]’可以匹配不在‘a’~‘z’'内的任意字符 |
\B | 匹配非单词边界 |
\D | 匹配一个非数字字符,等价于 [^0-9] |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\S | 匹配任何非空白字符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK |
\W | 匹配任何非单词字符。等价于‘[^A-Za-z0-9_]’ |
除了邮箱的正则表达式以外,还有一些常用的正则表达式,如下表所示。
编号 | 正则表达式 | 作用 |
---|---|---|
1 | \d{15}|\d{18} | 验证身份证号码(15位或18位) |
2 | \d{3}-\d{8}|\d{4}-\d{7} | 验证国内的固定电话(区号有3位或4位,并在区号和电话号码之 间加上-) |
3 | ^[1-9]\d*$ | 验证字符串中都是正整数 |
4 | ^-[1-9]\d*$ | 验证字符串中都是负整数 |
5 | ^-?[1-9]\d*$ | 验证字符串中是整数 |
6 | ^[A-Za-z]+$ | 验证字符串中全是字母 |
7 | A[A-Za-z0-9]+$ | 验证字符串由数字和字母构成 |
8 | [\u4e00-\u9fa5] | 匹配字符串中的中文 |
9 | [^\x00-\xff] | 匹配字符串中的双字节字符(包括汉字) |