如何把字符串“1.B2.C3.A4.B5.A6.C7.AC8.BC9.AC10.BD11.(1)810 N (2)5 m/s 12.5倍” 转化成
1.B
2.C
3.A
4.B
5.A
6.C
7.AC
8.BC
9.AC
10.BD
11.(1)810 N (2)5 m/s 12.5倍
即以“数字.”分割字符串C#

解决方案 »

  1.   

    你后面不是都有.那以.分割有问题没split()方法
      

  2.   

    规则不统一。
    规则统一的话,用linq 或正则都行
      

  3.   

    楼主的你11.那里写错了吧?是不是?
    ...
    11.(1)810 N (2)5 m/s 
    12.5倍
      

  4.   

    楼主俺写了一个,你看看合适用不,但是你要确定你的'.'符号有全角与半角之分,实现思路是:
    1.把字符串转换成char数组(c#中的char表示一个unicode字符,所以包括了中文和全角字符)
    2.定义两个游标start和end
    3.为了便于解析文本,把游标初始定位到数组末尾,反向解析文本
    4.这里有几个判断
      a.如果当前字符为中文或者不为半角的'.',则移动游标start,递减
      b.如果当前字符为半角的'.'则取start到end子字符串存储到一个栈中,置end=start重新定位末尾游标
    5.重复执行步骤4直到start为0,这是全部子字符串已经存储到栈中了
    6.可以对栈进行Pop操作,输出所有的子字符串则得到结果
    class Program
    {
        static void Main(string[] args)
        {
            //需要解析的文本
            string txt = "1.B2.C3.A4.B5.A6.C7.AC8.BC9.AC10.BD11.(1)810 N  (2)5 m/s 12.5倍";
            //把文本转换成字符数组
            char[] c = txt.ToCharArray();
            //定义一个栈存放子字符串
            Stack<string> words = new Stack<string>();
            //定义游标
            int start = c.Length - 1;
            int end = start;
            //解析文本
            while (start > 0)
            {
                if (IsWord(c[start])) start--;
                if (c[start] == '.')
                {
                    while (start-- > 0)
                    {
                        if ((c[start] < '0' || c[start] > '9'))
                            break;                }
                    words.Push(txt.Substring(start + 1, end - start));
                    end = start;
                }
                start--;
            }
            //输出结果
            while (words.Count > 0)
            {
                Console.WriteLine(words.Pop());
            }        Console.ReadLine();
        }
        //判断是否是中文字符
        static bool IsWord(char code)
        {
            return Encoding.Default.GetByteCount(code.ToString()) == 1 ? false : true;
        }
    }  
    效果为:
    希望对你有帮助!!
      

  5.   

    步骤4.b中还有一个关键的算法是:
       此时找到了'.'还需要解析答案的数字编码,所以要判断start--是否一直是数字,否则已经找完一个选择了!!
       所以就有了以下的算法while (start-- > 0)
    {
       if ((c[start] < '0' || c[start] > '9')) break;
    }
      

  6.   


    class Program
    {
        static void Main(string[] args)
        {
            //需要解析的文本
            string txt = "1.B2.C3.A4.B5.A6.C7.AC8.BC9.AC10.BD11.(1)810 N  (2)5 m/s 12.5倍";
            //把文本转换成字符数组
            char[] c = txt.ToCharArray();
            //定义一个栈存放子字符串
            Stack<string> words = new Stack<string>();
            //定义游标
            int start = c.Length - 1;
            int end = start;
            //解析文本
            while (start > 0)
            {
                if (c[start] == '.')
                {
                    while (start-- > 0)
                    {
                        if ((c[start] < '0' || c[start] > '9'))
                            break;
     
                    }
                    words.Push(txt.Substring(start + 1, end - start));
                    end = start;
                }
                start--;
            }
            //输出结果
            while (words.Count > 0)
            {
                Console.WriteLine(words.Pop());
            }
     
            Console.ReadLine();
        }
    }
    优化了下,去掉IsWord判断,没必要的
    楼主这样能解决你的问题了吗?
      

  7.   

     string str = "1.B2.C3.A4.B5.A6.C7.AC8.BC9.AC10.BD11.(1)810 N (2)5 m/s 12.5倍";
                var ary = Regex.Matches(str, @"\d+[..].*?(?=\d+[..]|$)").OfType<Match>().Select(t => t.Value).ToArray();
                
      

  8.   

    谢谢hwenycocodq520 和 hjywyj ,正则我也不会,但确实能得到想要的结果!