VR引擎开发0204

88 阅读4分钟

字符串的一些方法

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

            StreamWriter fWrite = new StreamWriter("./1.TXT", true);//true表示,是否使用追加的形式
            while (true)
            {
                string addStr = Console.ReadLine();
                //q找出来对应的值不为-1,跳出循环
                int Qindex = addStr.IndexOf("q");//取得给定字符串或字符第一次出现的位置,没有找到就返回-1.
                Console.WriteLine(Qindex);
                if(Qindex != -1)
                {//subString
                    addStr = addStr.Substring(0, Qindex);
                    fWrite.WriteLine(addStr);
                    break;
                }
                else
                {
                    fWrite.WriteLine(addStr);
                }
            }//此程序可能有逻辑错误

一些例子

            string str1 = "12345";
            string str2 = "234";
            Console.WriteLine(str1.CompareTo(str2));//对比两个字符串是否相同,相同时返回0,不同时返回-1
            //字符串截取
            str1 =str1.Substring(1,3);//123,初始下标位置,个数
            Console.WriteLine(str1);
            string newStr = str1.Replace("1", "22"); //将字符串中的某个字符转换为其他字符串,返回一个新字符串

## 使用StringBuilder创建字符串

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

            StringBuilder str3 = new StringBuilder("1234");
            //当小于16时基本容量是16,大于16就扩展到字符串长度一致
            str3.Append("5");
            str3.Insert(0, "0");
            str3.Remove(0, 1);
           // str3.Clear();

            string str4 = str3.ToString();
            Console.WriteLine(str4);
            Console.WriteLine(str3.Length);
            Console.WriteLine(str3.Capacity);

正则表达式

image.png

各种元字符

(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中的一个字符

一些示例

            string pardia = @"[a-z]";//@取消转义  ,[]代表的是匹配其中任意一个字符,a-z的任意一个字符//只要有一个字母就返回true
            string pardia2 = @"[^0-9]";//加了 ^ 表示除了里面的字符//只要有一个不是里面的字符,就返回true
            string pardia3 = @".";//“.”匹配除了\n的任意字符
            string pardia4 = @"\W";//匹配特殊字符
            string pardia5 = @"\w";//匹配除了特殊字符以外的字符
            string pardia6 = @"\d";//匹配任意一个数字字符
            string pardia7 = @"[\\d]";//匹配
            string pardia8 = @"^1";//匹配开头是1的
            string pardia9 = @"1$";//匹配结尾是1的


            while (true)
            {
                string str = Console.ReadLine();
                Console.WriteLine(Regex.IsMatch(str, pardia7));
            }

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

                //把所有xxx都替换为太棒了
                string pattern = @"x+";
                string str = "xxx你好";
                string newstr = Regex.Replace(str, pattern, "太棒了");//匹配的字符串,正则表达式,替换的字符串
                Console.WriteLine(newstr);
                //返回的是match类型,如果要变成字符串要进行强转,返回第一个满足的子串

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


            string matchStr = "1023840123";
            string pattern1 = @"^\d*$";//表示匹配以数字开头,中间有多个数字,并以数字结尾的字符串
            bool isMatch =Regex.IsMatch(matchStr, pattern1);//返回bool值

匹配年份 0000到2999 月份1到12 日期1到31

            string pattern = @"^([0-2][0-9]{3})-([0][1-9]|[1][0-2])-([0][1-9]|[1-2][0-9]|[3][01])$";
            while (true)
            {
                string str1 = Console.ReadLine();
                Console.WriteLine(Regex.IsMatch(str1, pattern));
            }

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

文件夹和文件操作


            //创建一个文件夹
            Directory.CreateDirectory("./图书管理系统");
            //File.Create("./图书管理系统/123.txt");

            //删除空文件夹,创建一个目录对象
            DirectoryInfo dicinfo = new DirectoryInfo("./图书管理系统");
            dicinfo.Delete(true);//删除目录以及下面所有文件

            //  File.Delete("./1.TXT");

            //获取目录下面的文件的路径
            string[] str = Directory.GetFiles("./图书管理系统");
            //遍历删除
            foreach (string i in str)
            {
                File.Delete(i);
            }
            //正则表达式 匹配出所有满足txt文件类型的路径
            string pTxt = @".+\.txt$";//  “\” 取消转义

            foreach (string i in str)
            {
                if (Regex.IsMatch(i, pTxt))
                {
                    File.Delete(i);
                }
            }
            //获取文件夹名
            string[] dicNames = Directory.GetDirectories("./");
            //获取的是该目录下的所有文件夹路径
            Console.WriteLine(string.Join(" ",dicNames));

使用学到的文件操作,创建三个文件文件名分别是数学.txt,语文.txt,英语.txt,里面分别存放着50个学生的数学,语文,英语成绩,每一行放着名字和对应的分数,名字是小明1,小明2这样的规律显示,分数随机,每一行显示的完整内容是 科目+名字+分数,接下来用我们前面讲到的正则表达式,找出所有txt文件中的小明1的成绩逐行显示到1.txt文件中

            for (int i = 0; i < 50; i++)
            {
               Random random = new Random();
                int a = random.Next(100);
                fsWriter1.WriteLine("语文" + "+" + "小明" + i + "+" + a);
                fsWriter2.WriteLine("数学" + "+" + "小明" + i + "+" + a);
                fsWriter3.WriteLine("英语" + "+" + "小明" + i + "+" + a);
            }
            fsWriter1.Close();
            fsWriter2.Close();
            fsWriter3.Close();

            StreamReader sRead1 = new StreamReader("./语文.txt", Encoding.UTF8);
            StreamReader sRead2 = new StreamReader("./数学.txt", Encoding.UTF8);
            StreamReader sRead3 = new StreamReader("./英语.txt", Encoding.UTF8);

            string patten = @".\+小明1\+.";

            StreamReader[] sRead = { sRead1, sRead2, sRead3 };
            foreach (StreamReader i in sRead)
            {
                StreamWriter fsWriter4 = new StreamWriter("./1.txt", true);
                string str1 = i.ReadToEnd();
            string[] sArray = str1.Split("\n");
            foreach (string s in sArray)
            {
                if (Regex.IsMatch(s,patten))
                {
                    fsWriter4.WriteLine(s);
                }
                
            }
                fsWriter4.Close();

            }