標籤:
類比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
類比Visual Studio中的完全符合尋找