博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟Visual Studio中的完全匹配查找
阅读量:4315 次
发布时间:2019-06-06

本文共 8266 字,大约阅读时间需要 27 分钟。

模拟Visual Studio中的完全匹配查找
 
public enum EnumDataType    {        中文 = 0,        英文 = 1,        数字 = 2,        特殊字符 = 3,        中文与特殊字符 = 4,        英文与数字 = 5,    }

 

public static class CharExtend    {        ///         /// 获得该字符类型        ///         ///         /// 
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;        }    }

 

///         /// 查找字符串strB在strA中的起止索引        ///         /// 被查找的字符串        /// 要查找的字符串        /// 
int值,没找到这返回-1
public static int IndexOf(string strA, string strB) { return strA.IndexOf(strB); }

 

///         /// 查找字符串strB在strA中的起止索引(模拟Visual Studio查找)        ///         /// 被查找的字符串        /// 要查找的字符串        /// 是否全字匹配(true/false)        /// 
int值,没找到这返回-1
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("内置的函数返回的索引值:" + IndexOf(strA, strB));                Console.WriteLine("自定义函数返回的索引值:" + 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

转载于:https://www.cnblogs.com/jzblogs/p/5670397.html

你可能感兴趣的文章
[转]Bat脚本处理ftp超强案例解说
查看>>
P3901 数列找不同
查看>>
利用无线网络数据包分析无线网络安全
查看>>
MEMBER REPORT
查看>>
[HAOI2006]受欢迎的牛
查看>>
使用jquery去掉时光轴头尾部的线条
查看>>
算法(转)
查看>>
网络字节顺序
查看>>
复制mueclipse项目到eclipse
查看>>
飞扬的小鸟
查看>>
玩转TypeScript(2) --简单TypeScript类型
查看>>
Asp.net 解析json
查看>>
程序猿崛起3——这一次,我用行动说话
查看>>
201521123038 《Java程序设计》 第一周学习总结
查看>>
每天一个linux命令(20):find命令之exec
查看>>
MVC HtmlHelper用法大全
查看>>
SQL分布式查询、跨数据库查询
查看>>
python国内豆瓣源
查看>>
redux、immutablejs和mobx性能对比(三)
查看>>
jQuery实现简单而且很酷的返回顶部链接效果
查看>>