C#面向对象10_异常_正则表达式

2021-07-12 15:07

阅读:717

标签:支持   操作文件   需要   处理程序   导致   子类   自己的   gate   表达   

异常_正则表达式

异常try…catch

在很多情况下,我们不确定程序是否能够正常运行,尤其是在需要第三方配合时,比如:用户输入、操作文件、连接数据库等等情况下,会有一些不可控的因素导致程序出现错误。因此,我们需要一种机制来处理程序的意外错误,这就是try…catch语句的应用范围了。

语法

try{

//有可能出现错误的代码

}

catch(Exception 异常变量)

{

//对异常进行处理

}finally

{

//无论是否出现异常都会被执行的代码

}

其中:

try用来尝试性的执行可能出错的代码,如果代码出错的话就会产生一个Exception异常对象,并将这个异常对象传入的catch语句中,try区域中报错之后的部分不会执行,而是直接去执行catch中代码。如果try区域中没有出错则catch部分中的代码就不会被执行。

try语句在执行的时候,性能是很低的,因此需要尽可能的避免使用try语句,通常我们只在需要第三方配合的情况下,使用try语句。

finally部分是可以省略的。

示例:

try

{

Console.WriteLine("请输入数字");

string sNum = Console.ReadLine();

float fNum = float.Parse(sNum);

Console.WriteLine("已成功转换为数值");

}

catch (Exception e)

{

Console.WriteLine("您的操作有误");

Console.WriteLine(e.ToString());

}

finally {

Console.WriteLine("操作完毕");

}

Console.WriteLine("最后try之外的代码");

 

Exception对象

就是C#用来存放错误信息的一个类,(e变量)包含的错误的文本信息,以及错误的类型。

catch (FormatException e) //Exception的子类来定义错误对象

{

if(e is System.FormatException)

Console.WriteLine("您的操作有误");

//Console.WriteLine(e.GetType().ToString());

}

手动抛出异常

它的作用就是手动制造一个错误信息,让程序中断并且(在try语句中不会中断)报错。比如:有时需要提醒其他程序员,这个代码有需要修改的地方。

语法:

throw异常对象;

示例:

throw new Exception();

throw new NotImplementedException();

FormatException e = new FormatException();

throw e;

 stringstringBuilder

stringstringBuilder都是用来存放字符串的类型,要想了这两者的区别,首先要明白栈内存、堆内存和string的特征。

 

string的特征之一:当我们修改字符串的时候,并不是在真正的修改字符串的原值,而是在堆内存中开辟了一个新的空间,并在其中创建了一个新的字符串,然后将栈内存中的变量名指向了新的字符串所在的地址。

 

正是因为string这个特征,所以字符串在需要频繁修改时性能会比较差。

 

因此,我们需要使用另外一种工具:stringBuilder来解决这个问题。当我们对stringBuilder进行修改时,修改的就是堆内存中的原值。

定义语法:

StringBuilder 变量名 = new StringBuilder();

StringBuilder 变量名 = new StringBuilder(“字符串”);

它的赋值过程与string不同,不能直接将双引号中的字符串直接赋值给stringBuilder的实例对象。

追加字符串:

StringBuilder不像string类型,不能用+加法运算符来追加字符串,而是必须用Append()来向字符串的末尾追加字符内容。

示例:

StringBuilder sb = new StringBuilder("这是一个字符串");

sb.Append(",说的对。");

Console.WriteLine(sb.ToString());

其他常用方法

StringBuilder.Insert(位置 , 内容)

将字符串插入到当前StringBuilder的指定位置。

StringBuilder.Remove(开始位置 , 删除长度)

从StringBuilder的指定位置开始删除指定长度个字符。

StringBuilder.Replace(原字符串 , 新字符串)

用指定字符串替换, StringBuilder中的能够匹配的原字符串。

正则表达式

是一种专门用来搜索和匹配字符串的机制,它能够用一些较复杂的规则来约定你要搜索的字符串的特征和范围,类似于通配符*。正则表达式不仅仅在C#中有效,它同样可以在javascriptjqueryphpjava等等语言中有效。

基本语法

正则表达式它拥有一套自己的语法规则,常见的语法包括:字符匹配、字符定位、转义匹配等等。

 

字符格式

语法解释

示例

\d

匹配数字(0~9)

\d匹配8,不匹配12

\D

匹配非数字

\D匹配c,不匹配3

\w

匹配任意单字符(字母或数字)

\w\w匹配A3,不匹配@3

\W

匹配非单字符

\W匹配@,不匹配c

\s

匹配空白字符

\d\s\d匹配3 8,不匹配123

\S

匹配非空字符

\S\S\S匹配A#4,不匹配3 d

.

匹配任意字符

....匹配A$ 5,不匹配换行

[…]

匹配方括号中任意字符

[b-d]匹配bcd,不匹配e

[^…]

匹配非括号中的字符。

[^b-d]匹配ea,不能匹配bcd

重复匹配语法

格式

语法解释

示例

{n}

匹配n次字符

\d{3}匹配\d\d\d,不匹配\d\d\d\d\d\d

{n,}

匹配n次或n次以上

\w{2,} 匹配\w\w\w\w\w以上,不匹配\w

{n,m}

匹配n次以上m次以下

\s{1,3}匹配\s\s\s\s\s\s,不匹配\s\s\s\s

?

匹配01

5?匹配50,不匹配非50

+

匹配一次或多次

\S匹配一个或更多\S

*

匹配0次以上

\W*匹配0以上\W

字符定位语法

格式

语法解释

^

定位后面模式的开始位置,就是从什么位置开始进行判断

$

前面的规则位于字符串末端

\A

前面规则的开始位置

\z

前面规则的结束位置

\Z

前面规则的结束位置(换行前)

\b

匹配一个单词的边界

\B

匹配一个非单词的边界

转义匹配语法:

格式

语法解释

\n

换行

\r

回车

\t

制表符

\v

垂直制表符

\f

换页

\c+大写字母

匹配Ctrl-大写字母,比如:\c5-匹配Ctrl + 5

“\”+实际字符

范围是 \ . * + ? | () {} ^ $ ,例如:\\匹配 \

因为这些字符已经有意义了,所以我们需要用转义字符才能使用它。

 

C#中使用正则表达式

需要用Regex(隶属于System.Text.RegularExpressions命名空间),它就是用来构造和使用正则表达式的类,其常用的类成员包括:IsMatch()Replace()Splite()Match类。

IsMatch()方法

该方法用于测试一个字符串是否满足指定的正则表达式,返回bool值,满足则返回true,否则返回false

示例:匹配一个字符串是否是重庆地区的座机号码

正则表达式:023\d{8}\z

//正则表达式

string RegeTest = @"023\d{8}\z";

//两个测试电话号码

string testPhone = "01089562341";

string testPhone2 = "02381818181";

//第一个参数是被检测的字符串,第二个参数是正则表达式

bool isCQ = Regex.IsMatch(testPhone, RegeTest);

Console.WriteLine("第一个是否为重庆座机号:"+isCQ);

isCQ = Regex.IsMatch(testPhone2, RegeTest);

Console.WriteLine("第二个是否为重庆座机号:" + isCQ);

Replace()方法

替换字符串中,能够被正则表达式匹配到的部分

 

示例:替换文本中的电子邮件地址

电子邮件地址的正则表达式:aa550@163.com \w{2,}@\w{1,}\.\w{1,10}

 

//正则表达式

string RegeTest = @"\w{2,}@\w{1,}\.\w{1,10}";

//邮件地址

string msg = "我厂需要采购钢材20万砘,我们的email是 tom@gmail.com";

if (Regex.IsMatch(msg, RegeTest))

{

Console.WriteLine(Regex.Replace(msg, RegeTest, "*********"));

//第一个参数是被检测的字符串,第二个参数是正则表达式,第三参数代表替换为该字符串

}

else

Console.WriteLine("没有电子邮箱地址");

Split()方法

Split方法能够帮助我们将一个字符串分隔为多个部分,按照这个字符串中重复出现的字符来进行分隔。Regex.Split()支持将多个字符作为分隔符。

string names = "小明_A_小花_B_小红_C_小芳_D_小强";

string[] nArr = Regex.Split(names,"_\\w_");

foreach (string str in nArr)

{

Console.WriteLine(str);

}

小练习:

定义多个字符串,其包含有正确的身份证号与错误的身份证号。要求用正则表达式来判断哪些身份证合法,哪些不合法。

判断是否为重庆地区的合法身份证号。500….18位。

判断是否为正确的手机号。1开头

开发一个简单的正则表达式验证器,输入两个字符串,第一个是正则表达式,第二个是要验证的字符串,然后显示两者是否匹配。

局部类partial

局部类型partial允许我们将一个类、结构体或接口分成几个部分,分别存放在几个不同的.cs文件中。

 

它适用于以下几种情况:

类比较大,需要区分为几个文件来存放。

一个类型中的部分代码是由代码生成器自动生成的,不宜与我们的代码混合在一起。

需要多个人合作编写一个类。

 

因此,它只是一种工作方式,而不一个语法概念或功能。

 

定义方法:

在同一个命名空间中,用partial来定义分布在同一个或不同.cs文件中的同名class,则这些位于不同物理位置的类,在逻辑上属于同一个类。

示例1:

partial class Program

{

static void Main(string[] args)

{

test();

}

}

partial class Program {

static void test() { 

Console.WriteLine("这是另外一个cs文件中的局部类");

}

}

示例2:

dog.cs文件中:

partial class dog

{

public string name { get; set; }

}

 

dog1.cs文件中:

partial class dog

{

public void bark() {

Console.WriteLine("汪汪叫");

}


dog2.cs文件中:

partial class dog

{

public void eat() {

Console.WriteLine("烤鸡翅膀,那个我最爱吃");

}

}

Program.cs文件中:

static void Main(string[] args)

{

dog d1 = new dog();

d1.name = "小白";

d1.bark();

d1.eat();

}

泛型委托

就是在委托中使用泛型

泛型委托

public delegate T delTest(T i);

static void Main(string[] args)

{

Program p = new Program();

delTeststring> dt1 = new delTeststring>(p.showS);

dt1("ssss");

delTestfloat> dt2 = new delTestfloat>(p.showF);

dt2(3.14f);

}

public string showS(string s1)

{

Console.WriteLine("ShowSS正在被执行");

return s1;

}

public float showF(float f1)

{

Console.WriteLine("ShowFF正在被执行");

return f1;

}

委托可以让方法像变量一样被传递

partial class Program
{

static void Main(string[] args)

{

//包含可以执行方法的委托实例

Test.delTest del1 = new Test.delTest(showInt);

Test t1 = new Test(del1,11);

}

 

static void showInt(int i) {

Console.WriteLine(i+100);

}

}

class Test {

public delegate void delTest(int i);

//用委托类型来定义构造函数的传入参数

//应用这里的more就用于接收一个包含了方法的委托实例。

public Test(delTest more, int i) {

more(i);

}
}

 

C#面向对象10_异常_正则表达式

标签:支持   操作文件   需要   处理程序   导致   子类   自己的   gate   表达   

原文地址:https://www.cnblogs.com/yigegaozhongsheng/p/9598480.html


评论


亲,登录后才可以留言!