C# 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)
来源:互联网 发布:淘宝windows10激活码 编辑:程序博客网 时间:2024/04/28 23:54
通常情况下,我们判断一个字符串中是否存在某值常常会用string.contains,其实判断一个字符串中存在某值的方法有很多种,最常用的就是前述所说的string.contains,相对来说比较常用的还有string.IndexOf和Regex.Match。直接上代码,后面在说些什么吧,通常情况下功能的实现最重要,作者的话,只对有心者有效。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;namespace ExistsInString{ class Program { static void Main(string[] args) { string str0 = "|456|"; string str1 = "|444|"; string str2 = "|111|222|333|444|555|666|777|888|999|000|"; //------------------------------------------ //String.Contains方法 if (str2.Contains(str0)) Console.WriteLine("String.Contains->true"); else Console.WriteLine("String.Contains->false"); if (str2.Contains(str1)) Console.WriteLine("String.Contains->true"); else Console.WriteLine("String.Contains->false"); //------------------------------------------ //String.IndexOf方法 int val1 = str2.IndexOf(str0);//不存在返回-1 Console.WriteLine("String.IndexOf(no exists)->" + val1); int val2 = str2.IndexOf(str1);//存在返回str1首字符所在str2中的位置(>=0) Console.WriteLine("String.IndexOf(exists)->" + val2); //------------------------------------------ //正则匹配方法 if (Regex.Match(str2, "[|]456[|]").Success) Console.WriteLine("Regex.Match(no exists)->true"); else Console.WriteLine("Regex.Match(no exists)->false"); if (Regex.Match(str2, "[|]444[|]").Success) Console.WriteLine("Regex.Match(exists)->true"); else Console.WriteLine("Regex.Match(exists)->false"); Console.ReadKey(); /* *如果上述三种方式都处理大量数据,效率如何呢? *以下循环六组数据说明 */ int loopCount = (int)10e6; DateTime lasttime = DateTime.Now; DateTime nowtime = DateTime.Now; for (int loop = 1; loop < 7; loop++) { Console.WriteLine("\r\nloop " + loop + " >>>>>>>"); //------------------------------------------ //String.Contains方法 //no exists lasttime = DateTime.Now; for (int i = 0; i < loopCount; i++) if (str2.Contains(str0)) { }; nowtime = DateTime.Now; TimeSpan tsStrConNoExists = nowtime - lasttime; //exists lasttime = DateTime.Now; for (int i = 0; i < loopCount; i++) if (str2.Contains(str1)) { }; nowtime = DateTime.Now; TimeSpan tsStrConExists = nowtime - lasttime; //------------------------------------------ //String.IndexOf方法 //no exists lasttime = DateTime.Now; for (int i = 0; i < loopCount; i++) if (str2.IndexOf(str0) >= 0) { };//上述已经提到不存在返回-1,存在返回一个非负整数,这里为什么不用 == -1 ,而是用了 >= 0 ,这是一个值得深思的问题? nowtime = DateTime.Now; TimeSpan tsStrIndNoExists = nowtime - lasttime; //exists lasttime = DateTime.Now; for (int i = 0; i < loopCount; i++) if (str2.IndexOf(str1) >= 0) { }; nowtime = DateTime.Now; TimeSpan tsStrIndExists = nowtime - lasttime; //------------------------------------------ //Regex.Match方法 //no exists Regex Reg0 = new Regex("[|]456[|]"); lasttime = DateTime.Now; for (int i = 0; i < loopCount; i++) if (Reg0.Match(str2).Success) { }; nowtime = DateTime.Now; TimeSpan tsStrRegNoExists = nowtime - lasttime; //exists Regex Reg1 = new Regex("[|]444[|]"); lasttime = DateTime.Now; for (int i = 0; i < loopCount; i++) if (Reg1.Match(str2).Success) { }; nowtime = DateTime.Now; TimeSpan tsStrRegExists = nowtime - lasttime; Console.WriteLine("no exists >>>"); Console.WriteLine("tsStrConNoExists = " + tsStrConNoExists.Milliseconds); Console.WriteLine("tsStrIndNoExists = " + tsStrIndNoExists.Milliseconds); Console.WriteLine("tsStrRegNoExists = " + tsStrRegNoExists.Milliseconds); Console.WriteLine("exists >>>"); Console.WriteLine("tsStrConExists = " + tsStrConExists.Milliseconds); Console.WriteLine("tsStrIndExists = " + tsStrIndExists.Milliseconds); Console.WriteLine("tsStrRegExists = " + tsStrRegExists.Milliseconds); } Console.ReadKey(); } }}
输出结果:
String.Contains->false
String.Contains->true
String.IndexOf(no exists)->-1
String.IndexOf(exists)->12
Regex.Match(no exists)->false
Regex.Match(exists)->true
loop 1 >>>>>>>
no exists >>>
tsStrConNoExists = 796
tsStrIndNoExists = 687
tsStrRegNoExists = 171
exists >>>
tsStrConExists = 484
tsStrIndExists = 234
tsStrRegExists = 796
loop 2 >>>>>>>
no exists >>>
tsStrConNoExists = 46
tsStrIndNoExists = 671
tsStrRegNoExists = 234
exists >>>
tsStrConExists = 546
tsStrIndExists = 437
tsStrRegExists = 734
loop 3 >>>>>>>
no exists >>>
tsStrConNoExists = 62
tsStrIndNoExists = 875
tsStrRegNoExists = 171
exists >>>
tsStrConExists = 609
tsStrIndExists = 562
tsStrRegExists = 781
loop 4 >>>>>>>
no exists >>>
tsStrConNoExists = 78
tsStrIndNoExists = 921
tsStrRegNoExists = 218
exists >>>
tsStrConExists = 609
tsStrIndExists = 640
tsStrRegExists = 828
loop 5 >>>>>>>
no exists >>>
tsStrConNoExists = 156
tsStrIndNoExists = 268
tsStrRegNoExists = 265
exists >>>
tsStrConExists = 609
tsStrIndExists = 578
tsStrRegExists = 890
loop 6 >>>>>>>
no exists >>>
tsStrConNoExists = 109
tsStrIndNoExists = 46
tsStrRegNoExists = 546
exists >>>
tsStrConExists = 625
tsStrIndExists = 609
tsStrRegExists = 953
测试结果中不难发现:
- 如果strA中不包括strB,使用strA.Contains(strB)更优;
- 反之,如果strA中包括strB,使用strA.IndexOf(strB)更优。
- Regex.Match在此方法中貌似没有体现出任何优势,它更适用于模糊匹配
具体要使用string.Contains,或是string.IndexOf要看形势。
之前有看过string下很多方法实现的代码(微软的,非他人),string.Contains是基于string.IndexOf上的一个方法,使用string.Contains的时候,会调用string.IndexOf,按原理,使用string.IndexOf的效率是要高于string.Contains的,但是这个测试结果让我大跌眼镜,应该是我在上述代码中使用的判断语句造成的这种非理想的测试结果,按照个人的意愿,还是希望多使用string.IndexOf。
其实一次微小的改变在当前可能影响不了什么,但是在日积月累中,它的优势就显而易见了。想要快速变得比他人更强,不需要多么费劲,只需要每天多做一点点(千分之一)
一年之后:(1 + 0.001)365 = 1.44倍
十年之后(1 + 0.001)3650 = 38.4倍
这是一种优势的计算,这是一种能力的计算,这是一种薪水的计算,...,不管是什么的计算,请记得每天只需进步一点点,随着时间的积累,你将会蜕变。该吃吃,该喝喝,该玩玩,该睡睡...只需要将你每天白日梦呓和漫无目的做无意义事情的时间用到它该用到的地方,你就在进步。
- C# 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)
- C#中string.contains和string.indexof的效率比较
- Java字符串String中contains与indexOf的区别
- javascript字符串string常用的几种方法(indexOf/lastIndexOf/search/charAt/match/slice/substr/replace/concat/split
- String 是否包含该字符串,使用 contains 和 indexOf 的区别
- string.indexof的几种方法
- String 中 的indexOf()
- C#中String.IndexOf 方法
- java 判断固定的中文字符串 判断字符串中是否包含固定的中文字符 String.indexOf(中文)
- C#实现String.IndexOf功能 查找字符串
- js 判断字符串是否包含某字符串,String对象中查找子字符indexOf,查找字符串出现的次数split
- string.indexof()和string.substring()的用法
- C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
- C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
- C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
- C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
- C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
- C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
- 使用sed替换替换指定行的日期部分
- C++ 标准库string类
- 确保一个程序只存在一个实例运行
- C++ 按行读取文件并按空格将数据存储为vector
- WIN10 使用Aventail VPN Connection无法连接公司VPN
- C# 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)
- House Robber III
- Python数据分析学习笔记四
- 图像掩膜和伪彩色处理matlab
- hdu2768Cat VS Dog(最大独立集)
- HTTP网络连接相关知识整理(二):网络IO
- 会场安排问题
- iOS-发布APP到APP STORE步骤(En)
- 工具类整理 php 文件处理 二维码生成 laravel 移动设备判断