none
关于文本"ABC123.456.789-0"分解成"ABC","123",".","456",".","789","-","0"比较快的解法是什么? RRS feed

  • 问题

  • 大家好!

    我处理的文本格式不一定都是这么规则的,结构都差不多,我的需求是很效率的把这些文本彻底分解成一部分一部分的。

    不知道是不是正则表达式比较效率些?目前我采用的是笨办法,利用字符串操作。

    希望大家提供个好方法

    先谢谢大家了

    2011年12月25日 3:17

答案

  • 虽然你结贴了。在给你个方法

    string[] result = Regex.Matches(yourStr,@"[A-Za-z]+|[0-9]+|\W+").Cast<Match>().Select(m=>m.Value).ToArray();
    



    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。
    2011年12月27日 5:46
    版主
  • 下边这个解法来源于我在英文站点的提问,希望两边提问不会被视为违规,中文站点这边不是很给力啊。。。

    private string value = "";
            private void button1_Click(object sender, EventArgs e)
            {
                List<String> result = new List<string>();
                String s = tbSource.Text;
                int i;
                int x = 0;
                for (int count = 0; count < s.Length;count ++ )
                {
                    char c= s [count ];
                    i = c;
                    if (i >= 65 && i <= 90) //A to Z (x=0)
                    {
                        if (x == 0)
                        {
                            value += c;

                        }
                        else
                        {
                            x = 0;
                            result.Add(value);
                            value = "";
                            value += c;
                        }
                    }
                    else if (i >= 97 && i <= 122) //a to z (x=1)
                    {
                        if (x == 1)
                        { value += c; }
                        else
                        {
                            x = 1;
                            result.Add(value);
                            value = "";
                            value += c;
                        }

                    }
                    else if (i >= 48 && i <= 57) //0 to 9 (x=2)
                    {
                        if (x == 2)

                        { value += c; }
                        else
                        {
                            x = 2;
                            result.Add(value);
                            value = "";
                            value += c;
                        }
                    }
                    else if (i == 46) // - (x=3)
                    {
                        if (x == 3)
                        { value += c; }
                        else
                        {
                            x = 3;
                            result.Add(value);
                            value = "";
                            value += c;
                        }
                    }
                    else if (i == 45) // .x=4
                    {
                        if (x == 4)
                        { value += c; }
                        else
                        {
                            x = 4;
                            result.Add(value);
                            value = "";
                            value += c;
                        }
                    }
                    else if (i == 42) // * x=5
                    {
                        if (x == 5)
                        { value += c; }
                        else
                        {
                            x = 5;
                            result.Add(value);
                            value = "";
                            value += c;
                        }
                    }
                    if (count == s.Length - 1)
                        result.Add(value );
                }
                string temp = "";
                for (int j = 0; j < result.Count; j ++)
                {
                    temp += "[ " + result[j ] + " ]";
                }
                lbResult.Text = temp;
            }

    • 已标记为答案 Allen PPL 2011年12月25日 17:51
    2011年12月25日 17:51

全部回复

  • 这个是我自己的解法,运算结果是 "A“,"B","C","123",".","456",".","789","-","0"

     private List<string> Parse(string id)
            {
                List<string> result = new List<string>();
                int last = 0;
                for (int i = 0; i < id.Length; i++)
                {
                    try
                    {
                        int test = int.Parse(id[i].ToString());
                        if (i == id.Length - 1)
                            result.Add(id.Substring(last + 1));
                    }
                    catch
                    {
                        if (i == 0)
                            result.Add(id.Substring(0, 1));
                        else
                        {
                            result.Add(id.Substring(last + 1, i - last - 1));
                            result.Add(id.Substring(i, 1));
                        }
                        last = i;
                    }

                }
                return result;
            }

     

    感觉这个解法够烂的。。。高手帮忙解下,谢谢

    2011年12月25日 11:47
  • 下边这个解法来源于我在英文站点的提问,希望两边提问不会被视为违规,中文站点这边不是很给力啊。。。

    private string value = "";
            private void button1_Click(object sender, EventArgs e)
            {
                List<String> result = new List<string>();
                String s = tbSource.Text;
                int i;
                int x = 0;
                for (int count = 0; count < s.Length;count ++ )
                {
                    char c= s [count ];
                    i = c;
                    if (i >= 65 && i <= 90) //A to Z (x=0)
                    {
                        if (x == 0)
                        {
                            value += c;

                        }
                        else
                        {
                            x = 0;
                            result.Add(value);
                            value = "";
                            value += c;
                        }
                    }
                    else if (i >= 97 && i <= 122) //a to z (x=1)
                    {
                        if (x == 1)
                        { value += c; }
                        else
                        {
                            x = 1;
                            result.Add(value);
                            value = "";
                            value += c;
                        }

                    }
                    else if (i >= 48 && i <= 57) //0 to 9 (x=2)
                    {
                        if (x == 2)

                        { value += c; }
                        else
                        {
                            x = 2;
                            result.Add(value);
                            value = "";
                            value += c;
                        }
                    }
                    else if (i == 46) // - (x=3)
                    {
                        if (x == 3)
                        { value += c; }
                        else
                        {
                            x = 3;
                            result.Add(value);
                            value = "";
                            value += c;
                        }
                    }
                    else if (i == 45) // .x=4
                    {
                        if (x == 4)
                        { value += c; }
                        else
                        {
                            x = 4;
                            result.Add(value);
                            value = "";
                            value += c;
                        }
                    }
                    else if (i == 42) // * x=5
                    {
                        if (x == 5)
                        { value += c; }
                        else
                        {
                            x = 5;
                            result.Add(value);
                            value = "";
                            value += c;
                        }
                    }
                    if (count == s.Length - 1)
                        result.Add(value );
                }
                string temp = "";
                for (int j = 0; j < result.Count; j ++)
                {
                    temp += "[ " + result[j ] + " ]";
                }
                lbResult.Text = temp;
            }

    • 已标记为答案 Allen PPL 2011年12月25日 17:51
    2011年12月25日 17:51
  • Hi Allen,

    很高兴你的问题得以解决.
    那个...毕竟中文论坛目前人很少, 很多都去过圣诞了. 放心, 中文论坛一向比较给力的, 龙年来了会更加给力的!

    祝你快乐每一天, 
    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us
    2011年12月26日 3:26
    版主
  • 虽然你结贴了。在给你个方法

    string[] result = Regex.Matches(yourStr,@"[A-Za-z]+|[0-9]+|\W+").Cast<Match>().Select(m=>m.Value).ToArray();
    



    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。
    2011年12月27日 5:46
    版主
  • 虽然你结贴了。在给你个方法

     

    string[] result = Regex.Matches(yourStr,@"[A-Za-z]+|[0-9]+|\W+").Cast<Match>().Select(m=>m.Value).ToArray();
    


     


    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。

     

    Hi George,
    Your IQ must be 100.

    MVP太给力了,非常感谢,虽然你的解法还没理解,但确实能解决我的问题

    你要是能给解释一二就更完美了,估计也不好解释。。。

    非常感谢,

    Allen

    2011年12月27日 11:44
  • 对于正则表达式,的确无法一两句说明白。你可以浏览一下我的帖子,在csdn。

    http://topic.csdn.net/u/20101204/10/a543196e-37da-46b0-b187-7ab3fe1b08b4.html?77550

    这里有我搜集的学习正则的方法。

    就这个,我给你解释一下

    "ABC123.456.789-0"分解成"ABC","123",".","456",".","789","-","0"

    首先要找规律,你分解的几块,分别是连续的字母,连续的数字,或是数字,字母之外的连续部分。

     

    [A-Za-z]+|[0-9]+|\W+

    这里的表达式就是按这个思路写的
    [A-Za-z]+表示连续的字母
    [0-9]+表示连续的数字
    \W表示非字符的连续内容

    |表示或者,三者中任何一个成立,就可以了。
    这个,我怎么写不是问题,关键是不知道你对正则知道多少,我该怎么说才能给你有意义的回复。如果一点都不懂,可以看看我那个帖子先。

     


    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。
    2011年12月27日 13:10
    版主