• .NET高级技术_04正则、序列化、XML


    一:正则表达式

    正则表达式是对字符串进行匹配的语法。像select * from t where name like '%张%'一样,定义了一些特殊的“元字符”,用来判断一个字符串是否满足某个规则。正则表达式非常深,编译器都是基于正则表达式,掌握基本使用即可。

    基本元字符

    1、.表示除了\n以外的任意的单个字符;
    2、[0-9]表示的是0到9之间任何一个整数数字;[a-z]任意一个小写字母;[A-Z]任意一个大写字母;
    3、\d数字;\D非数字;\s空白;\S非空白;\w小写字母和数字和汉字;\W特殊符号。正则表达式中的\是真的\;
    4、\表示对于.等特殊字符转义;
    5、()提升优先级别和提取组;
    6、[]代表一个区间中的任意一个[abc\d]就代表abc或者数字中的任意一个字符
    7、| 或者;
    8、+是出现1次到无限次;
    9、*是出现0次到无限次;
    10、?是出现0次到1次;
    11、{5}出现5次,{1,2}一次或两次,{5,8}为5至8次,{1,}最少一次,{3,}最少3次;
    12、^以…开始,$以…结束;

    使用Regex.IsMatch(被匹配字符串,正则表达式)判断是否匹配。C#中表示正则表达式最好前面加上@,可以避免转义带来的困扰。

    常见正则表达式

    1、这样写是有缺陷的Regex.IsMatch("18911111234", @"\d{11}")、Regex.IsMatch("3333333333333333", @"\d{11}"),应该使用^$改成Regex.IsMatch("18911111234333", @"^\d{11}$")2、手机号:@"^1\d{10}$"3@"^\d{5,10}$"匹配QQ号;
    
    4、ipv4地址:@"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"正则表达式很难“一步到位”。192.168.1.155@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$" 匹配邮箱;
    
    6[\u4e00-\u9fa5]  单个汉字;@"^[\u4e00-\u9fa5]{2,4}$" 长度为2-4的汉字姓名;
    
    7、身份证号(15位、18位数字)@"^(\d{15})$|^(\d{18})$"
    
    8、身份证号(18位,最后一位可能是x)@"^(\d{17})[\dxX]$"
    
    9、日期格式:"^\d{4}\-\d{1,2}\-\d{1,2}$" 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    namespace NS
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                //bool b1 = Regex.IsMatch("123","\\d{3}");
                bool b2 = Regex.IsMatch("123", @"\d{3}");
                bool b3 = Regex.IsMatch("123b1", @"\d{3}");  //有一部分匹配即可,返回true
                bool b4 = Regex.IsMatch("123", @"^\d{3}$");  //完全匹配
                Console.WriteLine(b4);
                Console.WriteLine(Regex.IsMatch("13812349876", @"^1\d{10}$"));
                Console.WriteLine(Regex.IsMatch("192.168.1.1", @"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"));
                Console.WriteLine(Regex.IsMatch("蛋", "[\u4e00-\u9fa5]"));
    
                Match match = Regex.Match("2015-01-10", @"^(\d{4})-(\d{1,2})-(\d{1,2})$");
                if (match.Success)
                {
                    string year = match.Groups[1].Value;  //注意序号从1开始
                    string month = match.Groups[2].Value;
                    string day = match.Groups[3].Value;
                    Console.WriteLine("年:" + year + " 月:" + month + " 日:" + day);
                }
    
                Console.ReadLine();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    二:对象序列化(二进制序列化)

    简介

    对象序列化是将对象转换为二进制数据(字节流),反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。

    BinaryFormatter类有两个方法:
    void Serialize(Stream stream, object pbj)
    对象obj序列化到Stream中
    object Deserialize(Stream stream)
    将对象从stream中反序列化,返回值为反序列化得到的对象

    namespace NS
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                Person p1 = new Person();
                p1.Name = "lilei";
                p1.Age = 10;
    
                BinaryFormatter binForm = new BinaryFormatter();
                using (FileStream fs = File.OpenWrite("d:/1.data"))
                {
                    binForm.Serialize(fs, p1);
    
                }
    
                BinaryFormatter binForm2 = new BinaryFormatter();
                using (FileStream fs = File.OpenRead("d:/1.data"))
                {
                    Person p2 = binForm2.Deserialize(fs) as Person;
                    Console.WriteLine("姓名:" + p2.Name + ", 年龄:" + p2.Age);
                }
    
                Console.ReadLine();
            }
        }
    
        [Serializable]
        class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    三:对象序列化的一些注意事项

    要序列化的类型必须标记为:[Serializable]
    该类型的父类也必须标记为:[Serializable]
    该类型中的所有成员的类型也必须标记为:[Serializable]

    序列化只会对类中的字段序列化,(只能序列化一些状态信息)
    类结构修改后之前序列化的内容尽量不要用了,否则可能会出错;

    为什么要序列化?

    保持对象的持久化,将一个复杂的对象转换流,方便我们的存储与信息交换

    应用:ASP.net中进程外Session要求对象可序列化;

    还有Xml序列化,应用开发中Json序列化已经代替了二进制序列化和Xml序列化等

    面试题:类可序列化的条件是?

    答:这个类必须标记为Serializable,如果这个类有父类,那父类也必须要编辑为Serialzable类型的,如果这类所有成员的也必须要编辑为Serializable。

    四:XML基本使用

    简介(可扩展标记语言)

    XML优点:容易读懂;格式标准任何语言都内置了XML分析引擎,不用单独进行文件分析引擎的编写。
    XML就是用一种格式化的方式来存储数据,我们可以通过用记事本打开。
    .net程序中的一些配置文件app.config、web.config文件都是XML文件。

    XML语法规范:标签/节点(Tag/Node)、嵌套(Nest)、属性。标签要闭合,属性值要用""包围,标签可以互相嵌套。

    XML树,父节点、子节点、兄弟节点(siblings)。

    XML编写完成以后可以用浏览器来查看,如果写错了浏览器会提示。如果明明没错,浏览器还是提示错误,则可能是文件编码问题。

    <Person>
      
      <Student StuID = "1">
        
        <StuName > 张三 StuName >  
      Student >
      <Student StuID = "2">
        <StuName> 李四 StuName>
    	<StuAge Age = "10" />
      Student>
    Person>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    XML语法特点

    1、严格区分大小写;
    2、有且只能有一个根节点;
    3、有开始标签必须有结束标签,除非自闭合:
    4、属性必须使用双引号;
    5、(可选)文档声明:
    6、注释:
    7、注意编码问题,文本文件实际编码要与文档声明中的编码一致。

    XML文件读取

    namespace NS
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                XmlDocument xmlDocument = new XmlDocument();
                xmlDocument.Load(@"d:\ceshi.xml");  //加载xml文件
                XmlNodeList xmlNodeList = xmlDocument.DocumentElement.ChildNodes;  //节点集合
                foreach (XmlNode node in xmlNodeList)
                {
                    XmlElement xmlElement = (XmlElement)node;
                    string stuID = xmlElement.GetAttribute("StuID");
                    Console.WriteLine("Student的StuID属性值为:" + stuID);
                    XmlNode cnode = xmlElement.SelectSingleNode("StuName");
                    string stuName = cnode.InnerText;
                    Console.WriteLine("StuName的文本内容为:" + stuName);
                }
                Console.ReadKey();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    XML文件生成

    namespace NS
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                Person[] persons = { new Person(1, "lilei", 20), new Person(2, "hanmeimei", 10), new Person(3, "polly", 30) };
                XmlDocument doc = new XmlDocument();
                XmlElement ePersons = doc.CreateElement("Persons");  //创建根节点
                doc.AppendChild(ePersons);  //添加根节点:将Persons添加为文档的子节点,由于文档还没有子节点,所以这个节点就作为根节点
                foreach (Person person in persons)
                {
                    XmlElement ePerson = doc.CreateElement("Person");
                    ePerson.SetAttribute("id", person.Id.ToString());
                    XmlElement eName = doc.CreateElement("Name");
                    eName.InnerText = person.Name;
                    XmlElement eAge = doc.CreateElement("Age");
                    eAge.InnerText = person.Age.ToString();
                    ePerson.AppendChild(eName);
                    ePerson.AppendChild(eAge);
                    ePersons.AppendChild(ePerson);
                }
                doc.Save("d:/data.xml");
                Console.WriteLine("创建成功");
                Console.ReadLine();
            }
        }
    
        class Person
        {
            public Person(int id, string name, int age)
            {
                this.Id = id;
                this.Name = name;
                this.Age = age;
            }
    
            public int Id { set; get; }
            public string Name { set; get; }
            public int Age { set; get; }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    AI人工智能培训讲师ChatGPT讲师叶梓培训简历及提纲ChatGPT等AI技术在医疗领域的应用
    Linux下VSCode的安装和基本使用
    数据结构题型14-二叉树的遍历
    Fix Xcode14 bundle need sign
    区块链 - 基础知识 - 第一讲
    SpringCloudAlibaba系列微服务搭建笔记二-RestTemplate+Ribbon
    如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 2
    微慕积分商城插件
    Win10禁止应用独占麦克风
    研究生选控制嵌入式还是机器视觉好?
  • 原文地址:https://blog.csdn.net/zzyzxb/article/details/126357804