程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 模擬Visual Studio中的完全匹配查找,studio完全匹配

模擬Visual Studio中的完全匹配查找,studio完全匹配

編輯:C#入門知識

模擬Visual Studio中的完全匹配查找,studio完全匹配


模擬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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved