VR引擎10.17

111 阅读7分钟

一、大文件读取方式

1.FileStream文件流(操作字节可以读取各种文件信息)

(1)FileStream文件流和File的区别

File在读取文件的时候是一次性读取所有的文件信息,而FileStream是以文件流的形式一点点去读取文件的信息

(2)使用FileStream读取文件

image.png

(3)使用FileStream写入文件信息

image.png

2.StreamReader和StreamWrite读写文本文件(读取字符信息)

1.StreamReader

image.png

2.StreamWriter

image.png 小练习:写一个程序逐行输入字符串,将每一行的内容写入到同个目录下的1.txt文件并换行,最后遇到q字符结束写入

image.png

二、字符串类String

1.关于字符串的几个方法

image.png

image.png

2.使用StringBuilder创建字符串

1.为什么要使用StringBuilder

如果我们频繁去删除和添加字符串中的内容,使用string生成的字符串我们知道每次更改会重新指向堆中新的数据,这样会重复删除新建数据非常耗性能,如果使用StringBuilder不会频繁申请内存空间,可以自动向后扩展

2.StringBuilder创建字符串的方式

image.png

三、正则表达式

1.正则表达式有什么用

image.png

2.正则表达式是什么

正则表达式其实就是由普通字符以及特殊字符(元字符)组成的文字模式,该模式描述在查找文字主体时待匹配的一个或多个字符串。

3.各种元字符

(1)字符类

[ char_group]:匹配字符组中的任意一个字符

[^char_group]:匹配除字符组之外的任意一个字符

[first-last]:匹配从first到last的字符范围中的任意一个字符,字符范围包括first和last。

.一个点:通配符,匹配除\n之外的任意一个字符

\w:匹配任意一个单词(word)字符,单词字符通常是指A-Z、a-z和0-9

\W:匹配任意一个非单词字符,是指除A-Z、a-z和0-9之外的字符

\s:匹配任意一个空白字符

\S:匹配任意一个非空白字符

\d:匹配任意一个数字字符

\D:匹配任意一个非数字字符
复制代码

(2)定位类

^:默认情况下,匹配字符串的开始位置;在多行模式下,匹配每行的开始位置;

$:默认情况下,匹配字符串的结束位置,或 字符串结尾的\n之前的位置;在多行模式下,匹配每行结束之前的位置,或者每行结尾的\n之前的位置。

\A:匹配字符串的开始位置;

\Z:匹配字符串的结束位置,或 字符串结尾的\n之前的位置;

\z:匹配字符串的结束位置;

\G:匹配上一个匹配结束的位置;

\b:匹配一个单词的开始或结束的位置;

\B:匹配一个单词的中间位置;
复制代码

(3)量词、贪婪和懒惰

*:规定前面字符出现0次或多次

+:出现1次或多次

?:出现0次或1次

{n}:出现n次

{n,}:出现至少n次

{n,m}:出现n到m次

x|y x或者y中的一个字符
复制代码

3.Regex.Replace()方法替换匹配出来的字符串

image.png

4.Regex.IsMatch(字符串,正则表达式)判断字符串是否符合正则表达式

image.png

5.匹配是否是正确的邮箱

邮箱的格式是qq号(5~12位数字)+@qq.com

image.png

6.Regex.Match(s,pattern)匹配第一个满足的字符串

image.png

7.Regex.Matches(s,pattern)匹配所有满足的字符串并返回出来

image.png

8.常见的几个正则表达式

image.png

作者:用户8922541182901
链接:juejin.cn/post/715540…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

/*using System.Threading.Tasks.Dataflow;

using System;
using System.IO;
using System.Text;
namespace demo_10_17
{
   
    
    internal class Program
    {
        static void Main(string[] args)
        {
            // 1、接口 可以实现多继承,接口指定一组没有函数体的函数成员
            //C#本质在学:多种类库的使用
            //File类,读写文件 整个文件信息一次性全部读写出来,一般读写小文件
            string str = File.ReadAllText("./1.txt", Encoding.UTF8); //绝对路径和相对路径
            //读取所有行的信息
            Console.WriteLine(str);
            string[] strArray = File.ReadAllLines("./1.txt");  //读取所有行的内容放到数组中    
            foreach(string i  in strArray)
            {
                Console.WriteLine("第i行:{0}",i);  //打印每一行的信息
            }
           File.WriteAllText("./1.txt","替换的内容");
            string[] str3 = { "1", "2", "3" };
            File.AppendAllLines("./1.txt",str3);//表示将数组中的字符串逐行追加到文件中
            File.AppendAllText("./1.txt", "\n追加的内容");
            Console.WriteLine();

        }
    }
}*/


/*//泛型
namespace demo_10_17
{
    public class MyMath<T> //创建了一个泛型类,T的类型由我创建对象的时候决定
    {
        public T GetNum(T num1,T num2)
        {
            dynamic num3 = num1;//动态类型的变量,我们可以将泛型的值赋给动态类型的变量,就可以进行运算操作
            dynamic num4 = num2;
            return num3+num4;
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            MyMath<string>  math = new MyMath<string>(); //创建了一个math对象,这时T的类型为string类型
            Console.WriteLine(math.GetNum("asdfghj","qertyrt"));
            MyMath<int> math1 = new MyMath<int>(); //这时T的类型为int类型
            Console.WriteLine(math1.GetNum(123,345));

        }
    }
}*/



/*namespace demo_10_17
{

    internal class Program
    {
        static void Main(string[] args)
        {*/
/* List<int> list = new List<int>() { 1, 12, 1, 2, 3, 2, 2, 6, 5 };//定义了一个泛型列表
 //元素长度 count 列表的容量 capacity
 Console.WriteLine(list.Count); //如果里面没有值的话,元素的个数是0,容量也是0
 Console.WriteLine(list.Capacity);
 list.Add(88);
 Console.WriteLine(list.Count - 1); //读取最后一个的值
 list.Insert(0, 5); //在下标为0的位置插入一个5
 Console.WriteLine(list[0]);
 list.Remove(5); //填你要删除的元素
 list.RemoveAt(0);//填要删除的元素的下标
 foreach (int i in list)
 {
     Console.WriteLine(i);
 }

 //集合类 字典 键和值
 Dictionary<string, string> dic = new Dictionary<string, string>();
 dic.Add("name", "王三");  //前面表示键名,后面表示值
 Dictionary<string[], string> dic2 = new Dictionary<string[], string>();
 dic2.Add("name2", "小明");
 dic2.Concat(dic2);
 foreach (string k in dic.Values) //表示遍历所有的值
 {
     Console.WriteLine("值为{0}", k);
 }
 foreach (string k in dic.Keys) //表示遍历所有的键名
 {
     Console.WriteLine("键名为{0}", k);
 }
 foreach (KeyValuePair<string, string> k in dic) //KeyValuePair表示键值对的类型
 {
     Console.WriteLine("值为{0},键名为{1}", k.Value, k.Key);

 }
 Console.WriteLine(dic.ContainsKey("name")); //ture
 Console.WriteLine(dic.ContainsValue("王三"));  //ture
*/

//练习1 将一个数组中的奇数放在一个集合中,再把偶数放在另一个集合中,最终将两个集合合并为一个集合,并且奇数显示在左边,偶数显示在右边
/*         int[] a = {1,3,2,4,5};
         List<int> list1= new List<int>();
         List<int> list2= new List<int>();
         foreach(int i in a)
         {
             if (i % 2 != 0) { list1.Add(i); }
             else { list2.Add(i); }
         }
         list1=list1.Concat(list2).ToList();  //合并list1和list2返回一个新的列表
         foreach(int i in list1)
         {
             Console.WriteLine(i);
         }

      //练习2 使用字典的方式计算出任意字符串中每个字符出现的次数
         string str1 = "qwertyutttqq";
         Dictionary<char, int> dic1 = new Dictionary<char, int>();
         foreach (char i in str1)
         {
             if (dic1.ContainsKey(i)) //判断字典dic1中有没有对应的键名
             {
                 dic1[i]++;
             }
             else
             {
                 dic1.Add(i, 1);
             }
         }
         foreach(KeyValuePair<char, int> k in dic1)
         {
             Console.WriteLine("字符{0},出现的次数为{1}",k.Key,k.Value);
         }
     }
 }
}*/











//大文件读取方式 FileStream文件流 读取的是字节,可以读取所有的文件
/*  FileStream fsRead = new FileStream("./1.txt",FileMode.OpenOrCreate,FileAccess.Read);
   //创建一个数组
   byte[] fsByte = new byte[1024*1024*4]; //规定读取最大的字节长度
  //开始读取文件,读取完返回的是实际读取到的字节数
  int rNum=fsRead.Read(fsByte);
      //根据字节数,将读取到的字节转为字符串
      string a=Encoding.Default.GetString(fsByte,0,rNum); 
      Console.WriteLine(a);
      Console.WriteLine(rNum);
      fsRead.Close(); //关闭文件流
      fsRead.Dispose();//释放所占的资源*/


//写入 替换 追加
/* using (FileStream fdWrite = new FileStream("./1.txt", FileMode.Append, FileAccess.Write))
 {
     string b = "123456";
     //将字符串转成字节
     byte[] fdByte = Encoding.UTF8.GetBytes(b);
     fdWrite.Write(fdByte); //将文件信息使用追加的形式写入到文件中
 }
 //读取的是字符串 
 StreamReader fileRead = new StreamReader("./2.txt",Encoding.Default);
 *//*string fileString = fileRead.ReadLine();//读取每一行的信息
 char allText = fileRead.ReadToEnd();//读取所有的信息
 Console.WriteLine(fileString);*//*
 Console.WriteLine((char)fileRead.Read());

 fileRead.Close(); //关闭文档流*/

//写入信息
/* StreamWriter fileWrite = new StreamWriter("./1.txt");
 fileWrite.WriteLine("第一行");
 fileWrite.WriteLine("第二行");
 fileWrite.Close();
*/

//练习1 输入每一行的内容,逐行写入到1.TXT中直到遇到q结束
using System;
using System.Text;
using System.IO;

namespace demo_10_17
{


    internal class Program
    {
        static void Main(string[] args)
        {/*
            StreamWriter fileWrite = new StreamWriter("./1.txt");
            while (true)
            {
                string addStr = Console.ReadLine();
                //什么时候跳出循环,q找出来对应的值不为-1
                int Qindex = addStr.IndexOf("q");
                if (Qindex != -1) //说明q存在
                {
                    addStr = addStr.Substring(0, Qindex);
                    fileWrite.WriteLine(addStr);
                    break;
                }
                else  //q不存在
                {
                    fileWrite.WriteLine(addStr);
                }
            }
            string str = "asdfa";
            Console.WriteLine(str.IndexOf("k")); //如果找到该字符串,返回第一次出现的位置,没有的话就返回0
            */

            //StringBuilder,申请了一个动态内存空间
            StringBuilder builderStr1 = new StringBuilder(4,20);//基本容量,最大容量
            StringBuilder builderStr2 = new StringBuilder("asdfghjkl");
            builderStr1.Append("asdfg"); //追加到最后
            builderStr1.Insert(0, "1");  //在指定下标位置插入内容
            builderStr1.Remove(0,1); //从0开始删除,删除一个字符
            builderStr1[0] = '2';
            Console.WriteLine(builderStr1);
            Console.WriteLine(builderStr1.Capacity);
        }
    }
}