模拟Visual Studio中的完全匹配查找

public enum EnumDataType
    {
        中文 = 0,
        英文 = 1,
        数字 = 2,
        特殊字符 = 3,
        中文与特殊字符 = 4,
        英文与数字 = 5,
    }
public static class CharExtend
    {
        /// <summary>
        /// 获得该字符类型
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public static EnumDataType GetDataType(this char item)
        {
            //范围(0x4e00~0x9fff)转换成int(ch-from~ch-end)
            int chfrom = Convert.ToInt32("4e00", 16);
            int chend = Convert.ToInt32("9fff", 16);

            if (item >= ‘0‘ && item <= ‘9‘)
                return EnumDataType.数字;
            else if (item >= ‘A‘ && item <= ‘z‘)
                return EnumDataType.英文;
            else
            {
                int code = Char.ConvertToUtf32(item.ToString(), 0);
                if (code >= chfrom && code <= chend)
                    return EnumDataType.中文;
                else
                    return EnumDataType.特殊字符;
            }
        }
    }
public static class BoolExtend
    {
        public static bool IsTrue(this bool bl)
        {
            return bl==true;
        }

        public static bool IsFalse(this bool bl)
        {
            return bl == false;
        }
    }
/// <summary>
        /// 查找字符串strB在strA中的起止索引(模拟Visual Studio查找)
        /// </summary>
        /// <param name="strA">被查找的字符串</param>
        /// <param name="strB">要查找的字符串</param>
        /// <param name="fullMatched">是否全字匹配(true/false)</param>
        /// <returns>int值,没找到这返回-1</returns>
        public static int IndexOf(string strA, string strB, bool fullMatched)
        {
            /*
             * 如果要查找的是中文、特殊符号,则完全匹配与非完全匹配结果一样
             *
             * 如果要查找的是英文、数字,则需做特殊处理(完全匹配格式【其他】【英文/数字】【其他】
             * 即还需匹配前后字符类型必须与要查找的类型不同
             *
             */

            //如果要查字符串长度大于被查找字符串,则直接返回-1
            if (strB.Length > strA.Length)
                return -1;

            EnumDataType[] types = new EnumDataType[2];
            if (fullMatched.IsTrue())
            {
                #region MyRegion
                if ((strB[0].GetDataType() == EnumDataType.中文 || strB[0].GetDataType() == EnumDataType.特殊字符))
                {
                    types[0] = EnumDataType.中文与特殊字符;
                }
                else
                {
                    types[0] = EnumDataType.英文与数字;
                }

                if ((strB[strB.Length - 1].GetDataType() == EnumDataType.中文 || strB[strB.Length - 1].GetDataType() == EnumDataType.特殊字符))
                {
                    types[1] = EnumDataType.中文与特殊字符;
                }
                else
                {
                    types[1] = EnumDataType.英文与数字;
                }
                #endregion
            }

            int index = -1;
            if (strA.Length > 1)
            {
                for (int i = 0; i <= strA.Length - strB.Length; i++)
                {
                    //每次在strAight中取等长的字符串与strB比较,判断是否相等
                    if (strA.Substring(i, strB.Length) == strB)
                    {
                        //不是全字匹配
                        if (fullMatched.IsFalse())
                        {
                            //strB在strA中的找到的第一个匹配的起始索引为i
                            index = i;
                            break;
                        }
                        else//是全字匹配
                        {
                            //判断变量i是开始还是结束
                            if (i > 0 && i < strA.Length - strB.Length)
                            {
                                #region MyRegion
                                //匹配项前后第一个字符都不是字母和数字
                                char start = strA.Substring(i - 1, 1)[0];
                                char end = strA.Substring(i + strB.Length, 1)[0];

                                EnumDataType startType=start.GetDataType();
                                EnumDataType endType = end.GetDataType();

                                if (types[0] == EnumDataType.中文与特殊字符)
                                { }
                                else if (types[0] == EnumDataType.英文与数字 && startType != EnumDataType.英文 && startType != EnumDataType.数字)
                                { }
                                else
                                {
                                    continue;
                                }

                                if (types[1] == EnumDataType.中文与特殊字符)
                                { }
                                else if (types[1] == EnumDataType.英文与数字 && endType != EnumDataType.英文 && endType != EnumDataType.数字)
                                { }
                                else
                                {
                                    continue;
                                }

                                //通关后找到索引
                                index = i;//是全字匹配
                                break;
                                #endregion
                            }
                            else if (i == 0)//如果是开始
                            {
                                #region MyRegion
                                if (i + strB.Length >= strA.Length)
                                {
                                    index = i;//是全字匹配
                                    break;
                                }
                                else
                                {
                                    char end = strA.Substring(i + strB.Length, 1)[0];
                                    EnumDataType endType = end.GetDataType();

                                    if (types[1] == EnumDataType.中文与特殊字符)
                                    { }
                                    else if (types[1] == EnumDataType.英文与数字 && endType != EnumDataType.英文 && endType != EnumDataType.数字)
                                    { }
                                    else
                                    {
                                        continue;
                                    }

                                    index = i;//是全字匹配
                                    break;
                                }
                                #endregion
                            }
                            else if (i == strA.Length - strB.Length)//如果是结束
                            {
                                #region MyRegion
                                char start = strA.Substring(i - 1, 1)[0];
                                EnumDataType startType = start.GetDataType();

                                if (types[0] == EnumDataType.中文与特殊字符)
                                { }
                                else if (types[0] == EnumDataType.英文与数字 && startType != EnumDataType.英文 && startType != EnumDataType.数字)
                                { }
                                else
                                {
                                    continue;
                                }

                                index = i;//是全字匹配
                                break;
                                #endregion
                            }
                        }
                    }
                }
            }
            else
            {
                if (strA == strB)
                    index = 0;
            }
            return index;
        }
static void Main(string[] args)
        {
            TestIndexOf();
            Console.Read();
        }

static void TestIndexOf()
        {
            string go = string.Empty;
            do
            {
                Console.WriteLine("请输入要被查找的字符串");
                string strA = Console.ReadLine();
                Console.WriteLine("请输入要查找的字符串");
                string strB = Console.ReadLine();
                Console.WriteLine("是否全字匹配(Y/N)?");
                string matched = Console.ReadLine().ToLower();
                Console.WriteLine("内置的函数返回的索引值:" + ZJZCommon.Utility.IndexOf(strA, strB));
                Console.WriteLine("自定义函数返回的索引值:" + ZJZCommon.Utility.IndexOf(strA, strB, matched == "y" ? true : false));
                Console.WriteLine("是否继续(Y/N)?");
                go = Console.ReadLine().ToLower();
            }
            while (go == "y");
        }

转载请注明出处:http://www.cnblogs.com/jzblogs/p/5670397.html

时间: 2024-10-12 01:07:01

模拟Visual Studio中的完全匹配查找的相关文章

在Visual Studio中使用正则表达式匹配换行和批量替换

系统环境:Windows 8.1 Enterprise Update 2 x64 开发环境:Mircosoft Visual Studio Ultimate 2013 Update 2 RC 问题:如何在Visual Studio中使用正则表达式匹配换行符,空白符,Tab符等特殊符号,并且在当前文档或当前项目或整个解决方案中批量替换你指定的代码文字? 例子: 1 /// <summary> 2 /// 根据条件查询表中所有数据 3 /// </summary> 4 /// <

在 Visual Studio 中使用正则表达式

Visual Studio 使用 .NET framework 正则表达式查找和替换文本. 在 Visual Studio 2010 和早期版本中,Visual Studio 在“查找和替换”窗口中使用自定义正则表达式语法.  本主题介绍如何将一些更常用的自定义正则表达式符号转换为 .NET 版本. 用途 新建 旧 新示例 匹配任何单个字符(分行符除外) . . a.o 匹配“around”中的“aro”和“about”中的“abo”,但不匹配“across”中的“acro”. 匹配前面表达式的

Visual Studio中用于ASP.NET Web项目的Web服务器

当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们. 利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Express.Internet Information Services (IIS).外部主机或自定义 Web 服务器. 您可以将其中任何一种 Web 服务器用于基于文件的 Web 应用程序项目. 对于基于文件的网站项目,您可以使用 IIS Express. 本主题介绍每种 Web 服务器以及如何选择要用

Visual Studio 中用于 ASP.NET Web 项目的 Web 服务器

Visual Studio 中用于 ASP.NET Web 项目的 Web 服务器 当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们.             利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Express.Internet Information Services (IIS).外部主机或自定义 Web 服务器.  您可以将其中任何一种 Web 服务器用于基于文件的 Web 应用程序项目.

VS2015--在 Visual Studio 中调试时映射调用堆栈上的方法

https://msdn.microsoft.com/zh-cn/library/dn194476.aspx 在 Visual Studio 中调试时映射调用堆栈上的方法 创建代码图,以便在调试时对调用堆栈进行可视化跟踪.你可以在图中进行标注以跟踪代码执行的操作,以便专注于查找 Bug. 生成调用堆栈图 1 开始调试.(键盘:"F5") 2 在你的应用进入中断模式或你单步执行某一函数之后,请选择"代码图".(键盘:Ctrl + Shift + `) 当前的调用堆栈在

Visual Studio中开发

如何在Visual Studio中开发自己的代码生成器插件  Visual Studio是美国微软公司开发的一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具.代码管控工具.集成开发环境(IDE)等等,且所写的目标代码适用于微软支持的所有平台.可以说.NET开发人员离不开它,它可以极大的提高编写软件的效率. Visual Studio作为一个世界级开发工具,当然支持通过插件方式对其功能进行扩展,开发人员可以定制自己的插件来进一步提升Visual Studio的功

在Visual Studio中入门F#

写在前面的话 个人由某方面的兴趣需要学习 F#,网络上有关F#的中文资料很少,微软官方有很不错的文档,但是很可惜的是绝大部分的章节都是英文的.个人是一位.NET爱好者,想自己将 F# 的官方文档翻译出来,算是为了自己喜欢的 .NET 做一些贡献. 原文链接 Getting started with F# in Visual Studio 在这篇文章中 安装 F# 创建一个控制台应用程序 编写您的代码 运行您的代码 使用 F# Interactive 在 Visual Studio IDE 中支持

在Visual Studio中使用GitHub(使用篇)

一.准备工具 上一篇中我们已经安装了Git Extensions和Tortoisegit.在这里我们要为Visual Studio安装一个插件,专门用于Git. Git Source Control Provider,打开http://visualstudiogallery.msdn.microsoft.com/ 搜索"Git"关键字,即可搜索到该插件. 二.配置源码管理工具 三.配置帐户关联 四.使用 后面的事情就很简单了,创建文件夹 pull 一个副本,修改文件,commit文件,

Visual Studio中创建混合移动应用程序解决方案Xamarin Portable Razor

在Visual Studio中创建混合移动应用程序的一个解决方案是使用Xamarin Portable Razor工具,这是ASP.NET MVC API针对移动设备的一个轻量级实现.Xamarin编写了一个示例应用程序,演示了如何使用C#.本地API和Web技术编写iOS及Android应用. Visual Studio中创建混合移动应用程序解决方案Xamarin Portable Razor,布布扣,bubuko.com