黑马程序员技术交流社区

标题: 字符串问题 [打印本页]

作者: 李晓泉    时间: 2013-3-3 11:48
标题: 字符串问题
有如下字符串:【"患者:“大夫,我咳嗽得很重。”     大夫:“你多大年记?”     患者:“七十五岁。”     大夫:“二十岁咳嗽吗”患者:“不咳嗽。”     大夫:“四十岁时咳嗽吗?”     患者:“也不咳嗽。”     大夫:“那现在不咳嗽,还要等到什么时咳嗽?”"】。需求:请统计出该字符中“咳嗽”二字的出现次数,以及每次“咳嗽”出现的索引位置。
作者: 苗昆明    时间: 2013-3-3 12:56
读取text文件(字符串),用字典匹配咳嗽二字出现的地方并得到索引。
作者: 刘云东    时间: 2013-3-4 18:37
写了一个简单的小例子,问题是解决了,不过应该还有更简单的办法。
            string str = "我爱的人非常的爱我,是她爱我更多,还是我爱她更多呢?";
            string[] arr = { "爱" };
            int id = 0;
            arr = str.Split(arr,StringSplitOptions.RemoveEmptyEntries);
            Console.WriteLine("一共出现了{0}次",arr.Length);
            for (int i = arr.Length - 2; i >= 0; i--)
            {
                id = str.IndexOf("爱", id + 1);
                Console.WriteLine("出现的位置分别为{0}",id);
            }
            Console.ReadKey();
作者: 赵文博    时间: 2013-3-4 23:35
本帖最后由 赵文博 于 2013-3-5 01:25 编辑

楼上的解决方法可能是错误的,字符串分割得到的数组长度,并不一定是出现次数。
如果字符串以要查找的'爱'作为开始和结尾,得到的分割数组会还是原来的那个。
//在字符串str中查找字符串findstr,将查找到的位置全都放到集合posList,并返回posList
        static public List<int> FindStrs(string str, string findStr)
        {
            str = str.Trim();                                       //去掉空格
            findStr = findStr.Trim();                               //去掉空格
            List<int> posList = null;                               //初始化返回值,用来存放要查找的字符串出现位置

            if (str == "")                                          //入口参数校验
                return posList;

            if (findStr == "")                                         //入口参数校验
                return posList;


            posList = new List<int>();
            int position = 0;                                       //查找开始位置
            int strLen = str.Length;                                  //str的长度
            int findStrLen = findStr.Length;                          //要查找的字符串长度
            int index = -1;                                         //字符串查找的返回值
            while (position <= strLen)
            {
                index = str.IndexOf(findStr, position);             //从position位置开始查找字符串,找不到就会返回-1

                if (index == -1)                                    //如果没有找到,就退出循环
                    break;

                posList.Add(index);

                position = index + findStrLen + 1;                  //更新新的查找位置

            }

            return posList;
        }

        static void Main(string[] args)
        {
            string str = "爱我爱的人非常的爱我,是她爱我更多,还是我爱她更多呢?爱";     //要查找的字符串
            string findStr = "爱";                                                   //要查找的子字符串

            List<int> posList = FindStrs(str, findStr);

            if (posList != null)
            {
                for (int i = 0; i < posList.Count; i++)
                {
                    Console.WriteLine(posList);
                }

                Console.WriteLine("出现次数为" + posList.Count);

            };

            Console.ReadKey();

        }

1.png (25.25 KB, 下载次数: 35)

1.png

作者: 赵文博    时间: 2013-3-5 00:48
本帖最后由 赵文博 于 2013-3-5 02:01 编辑

调用字符床分割是不可行的,比如要在“爱爱爱”中查找“爱”及出现次数,分割出的数组长度会是0
可以用正则表达式
        static void Main(string[] args)
        {
            string str = "爱1爱2爱";
            string findStr = "爱";

            Regex r = new Regex(findStr);               // 定义一个Regex对象实例
            MatchCollection  m = r.Matches(str);        // 在字符串中匹配

            if (m != null)
            {
                for (int i = 0; i < m.Count; i++)
                    Console.WriteLine(m.Index);      //输出匹配位置

                Console.WriteLine("出现次数为"+m.Count);
            }


            Console.ReadKey();

        }


1.png (25.14 KB, 下载次数: 43)

1.png





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2