专栏首页Albert陈凯2018-09-06 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match),stringregex

2018-09-06 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match),stringregex

字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match),stringregex

通常情况下,我们判断一个字符串中是否存在某值常常会用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倍

这是一种优势的计算,这是一种能力的计算,这是一种薪水的计算,...,不管是什么的计算,请记得每天只需进步一点点,随着时间的积累,你将会蜕变。该吃吃,该喝喝,该玩玩,该睡睡...只需要将你每天白日梦呓和漫无目的做无意义事情的时间用到它该用到的地方,你就在进步。

有大小写字母的字符串与一个查找字符,使用类String方法indexOf()来判断在该字符串中该字符出现的次数

public class TestIndexOf {
    public static void main(String[] args) {
        int i=(new TestIndexOf()).f();
        System.out.println(i);
    }
    int f() {
        char c='H';
        String str="dhdisHIHkdsjfHiodfHHlkIFH";
        int i=str.indexOf(c);
        //System.out.println(i);调试用
        if(i==-1) {
            return 0;
        }
        int count=1;
        while(true) {
            i=str.indexOf(c,i+1);
            if(i!=-1) {
                count++;
            }
            else break;
        }
        return count;
    }
}

String contains indexOf不同 contains是找指定字符串是否包含一个字串,返回值的boolean类型,即只有true和false

indexOf有多个重载,但无论哪个,都是做一定的匹配,然后把匹配的第一个字符的位置返回,返回的是int类型,如果没找到,那么返回-1

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2018-11-14 短网址转换,使用百度的短网址,不需要注册身份验证既可以使用

    Albert陈凯
  • 2018-06-13 使用stream批量处理List内数据

    Albert陈凯
  • 2018-11-08 杀死If Else switch case(策略模式+工厂模式+map)套餐 Kill 项目中的switch case

    为了便于理解,举个没有业务逻辑的例子,基于这个例子上进行优化。 现在是12:47,举个饭后吃水果的例子哈哈哈(逃 假设我们可以选择的水果有香蕉、西瓜和苹果。吃香...

    Albert陈凯
  • Salesforce门店销售管理情景演示

    本视频演示了保乐力加如何利用Salesforce来管理门店销售,市场活动以及客户服务流程。

    臭豆腐
  • 模板方法模式浅析

    在开始本文之前,我们先来看下生活中的一些场景,比如造房子。有一个基本的骨架,每栋房子又可以有自己的特点,比如加个旗子,加一个塔楼等。

    孟君
  • PHP方法的返回值

    不仅是PHP,大部分编程语言的函数或者叫方法,都可以用return来定义方法的返回值。从函数这个叫法来看,本身它就是一个计算操作,因此,计算总会有个结果,如果你...

    硬核项目经理
  • PHP中Redis扩展无法加载问题

    phpredis编译出来的redis.so也需要拷贝到"/usr/lib64/php/modules/"中;

    叫我可儿呀
  • 学会WCF之试错法——超时

    服务契约 [ServiceContract] public interface IService { [OperationCon...

    甜橙很酸
  • asp.net web api 文件上传

    首先分别介绍正确的做法和错误的做法,然后分析他们的不同和错误之处,以便读者在实现此功能时可避开误区 1正确的做法 public class AvaterCont...

    甜橙很酸
  • Nodejs进阶:如何将图片转成datauri嵌入到网页中去

    本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 问题:将图片转成datauri 今天,在QQ群有个群友问了个问题:“nod...

    IMWeb前端团队

扫码关注云+社区

领取腾讯云代金券