c#拆分字符串英文和数字(包括国外所以文字)

 先创建一个类:

 /// <summary>
    /// 字符串分析
    /// </summary>
    interface IStringAna
    {
        /// <summary>
        /// key:文本包含的汉字或英文单词,value:汉字或英文单词出现的次数
        /// </summary>
        /// <param name="text"></param>
        /// <returns>key:文本包含的汉字或英文单词,value:汉字或英文单词出现的次数</returns>
        Dictionary<string, int> Ana(string text);
    }

    class StringAna : IStringAna
    {
        public Dictionary<string, int> Ana(string text)
        {
            var words = new List<string>();
            var dict = new Dictionary<string, int>();
            byte[] bts = Encoding.Unicode.GetBytes(text);
            //foreach (var bt in bts)
            //{
            //    Console.Write(string.Format("{0} ",bt));
            //}
            //Console.WriteLine();
            var pointer = 0;
            var i = 0;
            while (i <= bts.Length-2) 
            {                
                byte[] tmp;

                if (bts[i + 1] == 0 && bts[i] != 32)
                {
                    pointer = i;
                    while (pointer + 2 < bts.Length && bts[pointer +2] != 32 && bts[pointer + 2+1] == 0)
                    {
                        pointer += 2;
                    }
                    var len = pointer+2 - i;
                    tmp = new byte[len];
                    Array.Copy(bts, i, tmp, 0, len);
                    i = pointer+2;
                }
                else if (bts[i] == 32 && bts[i + 1] == 0)
                {
                    i += 2;
                    continue;
                }
                else
                {
                    tmp = new byte[] { bts[i], bts[i + 1] };
                    i += 2;
                }
                var word = Bytes2Word(tmp);
                words.Add(word);
                Put(dict, Bytes2Word(tmp));
            }
            return dict;
        }

        
        string Bytes2Word(byte[] bytes)
        {
            return Encoding.Unicode.GetString(bytes);
        }

        void Put(Dictionary<string,int> dict,string word)
        {
            int value;
            if(dict.TryGetValue(word,out value))
            {
                dict[word] = value + 1;
            }
            else
            {
                dict[word] = 1;
            }
           
        }
    }

实现接口:

     var text = GetTestText();//生成测试文本
            Console.WriteLine(text);
            IStringAna ana = new StringAna();
            var sp = Stopwatch.StartNew();
            var rlt = ana.Ana(text);
            Console.WriteLine($"Elapsed:{sp.ElapsedTicks}");
            if (rlt == null)
            {
                Console.WriteLine("error");
            }
            else
            {
                foreach(var item in rlt)
                {
                    Console.WriteLine($"{item.Key}:{item.Value}");
                }

 

转载于:https://www.cnblogs.com/zwyAndDong/p/7389533.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值