C#中如何分割以汉字结尾的中英字符串??
例如string str1="Mike Green麦克·格林 Mike James麦克·詹姆斯";如何分割成str2="Mike Green麦克·格林";
str3="Mike James麦克·詹姆斯";
private void button1_Click(object sender, EventArgs e) { richTextBox1.Text = SplitString(textBox1.Text); } // /// <summary> /// 方法说明:判断字符是否为中文字符 /// </summary> /// <param name="c">待判断的字符</param> /// <returns>是中文的返回ture,否则返回false</returns> private static bool RegexLetterOrDigit(char c) { if (Regex.IsMatch(c.ToString(), @"^[u4e00-u9fa5]")) { return true; } else { if ((int)c == 32) //空格保留 { return true; } return false; } } /// <summary> /// 方法说明:将原始字符串间加入换行符 /// </summary> /// <param name="oriString">需要分割的字符串</param> /// <returns>已分割的字符串</returns> public static string SplitString(string oriString) { //将原始字符串分割为逐个字符 char[] tempChar = oriString.ToCharArray(); //用于临时保存分割的字符,英文单词或数字整体占一项 List<string> lstTempString = new List<string>(); lstTempString.Clear(); Dictionary<int, string> dicValues = new Dictionary<int, string>(); int index = 0; for (int i = 0; i < tempChar.Length; i++) { //若为中文,则将其合并为一个字符串,加入字符串数组中 if (RegexLetterOrDigit(tempChar[i])) { string tempString = ConnectChar(tempChar, i, true); if (!string.IsNullOrEmpty(tempString)) { dicValues.Add(index, tempString); index++; } //跳过字母或数字的字符 for (int j = i; j < tempChar.Length; j++) { if (j < (tempChar.Length - 1) && RegexLetterOrDigit(tempChar[j + 1])) continue; else { i = j; break; } } } } index = 0; for (int i = 0; i < tempChar.Length; i++) { //若为中文,则将其合并为一个字符串,加入字符串数组中 if (!RegexLetterOrDigit(tempChar[i])) { string tempString = ConnectChar(tempChar, i, false); if (!string.IsNullOrEmpty(tempString)) { dicValues[index] = dicValues[index] + tempString; index++; } //跳过字母或数字的字符 for (int j = i; j < tempChar.Length; j++) { if (j < (tempChar.Length - 1) && !RegexLetterOrDigit(tempChar[j + 1])) continue; else { i = j; break; } } } } foreach (int key in dicValues.Keys) { lstTempString.Add(dicValues[key].Trim()); //去除首尾空格 } return string.Join("\n", lstTempString.ToArray()); } /// <summary> /// 方法说明:以其他字符作为分隔符将连续字符连接在一起 /// </summary> /// <param name="oriCharArray">未经处理的按字符分割的字符数组</param> /// <param name="currentNum">字符第一个字母或数字的索引</param> /// <param name="isChinese">是否中文</param> /// <returns>已连接的字符串</returns> private static string ConnectChar(char[] oriCharArray, int currentNum, bool isChinese) { //保存字符数组 List<string> finalArray = new List<string>(); finalArray.Clear(); //作为字符串数组的下标 int num = 0; //记录数组的大小 int size = 0; //检查是否包含连续的字符,将其保存在一起 for (int i = currentNum; i < oriCharArray.Length; i++) { finalArray.Add(oriCharArray[i].ToString()); bool _isCN = false; if (i < (oriCharArray.Length - 1)) { _isCN = RegexLetterOrDigit(oriCharArray[i + 1]); } if (!isChinese) _isCN = !_isCN; if (i < (oriCharArray.Length - 1) && _isCN) { num++; continue; } else break; } string[] strFianlArray = finalArray.ToArray(); //记录含有有效字符串的字符串数组的大小 size = Array.IndexOf(strFianlArray, null); if (size > 0) //将数组重新设定大小 Array.Resize(ref strFianlArray, size); return String.Join("", strFianlArray); }