下面描述中连续的数字的长度规则满足:
a:连续长度需>=4.
b:必须是2的倍数.(4,6,8,10,12,14.....)所截取的都是连续的数字,混合的则不限制长度1.A1234        -> A 1234
  A12345       -> A1 2345
  123A123456   -> 123A 123456
  1A1234567    -> 1A1 234567 
  12A12A2345   -> 12A12A 2345
  A1234A12345  -> A 1234 A1 2345
如果开始不是连续的数字,则从字符串后往前计算连续的数字进行分割 2.12345A12345   -> 1234 [5A12345->这个按1来进行分割(分割结果:5A1 2345)]
如果开始是连续的数字,则先截取开始连数的数字,剩下的按1来进行分割3.12ABCE12A     -> 12ABCE12A
如果字串中没有连续的数字则不进行截取

解决方案 »

  1.   

    重复贴要被删的啊,赶紧结吧,已经帮你做出来了string[] strings = { "A12345", "A123456", "123A4567", "12345A12345", "123A12B223C" };
    string pattern = @"(?=\d*4\d*)(\d{2}){2,}|.+?(?=\d*4\d*)(?=(\d{2}){2,}(?!\d))";
    Regex regex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.ExplicitCapture);
    foreach (string str in strings)
    {
        Console.Write("\n{0}\t->\t", str);
        MatchCollection mc = regex.Matches(str);
        if (mc.Count == 0)
        {
            Console.Write(str);
        }
        else
        {
            foreach (Match m in mc)
            {
                Console.Write("{0} ", m.Value);
            }
        }
    }
      

  2.   

    try...string[] test = new string[] {"A1234", "A12345", "123A123456", "1A1234567", "12A12A2345", "A1234A12345" };
    Regex reg = new Regex(@"(\d{4}(?:\d{2})*)", RegexOptions.RightToLeft);
    foreach (string src in test)
    {
         richTextBox2.Text += src.PadRight(12, ' ') + "->  ";
         foreach (string s in reg.Split(src))
         {
              richTextBox2.Text += s + " ";
         }
         richTextBox2.Text += "\n";
    }
    /*---------输出-----------
    A1234       ->  A 1234  
    A12345      ->  A1 2345  
    123A123456  ->  123A 123456  
    1A1234567   ->  1A1 234567  
    12A12A2345  ->  12A12A 2345  
    A1234A12345 ->  A 1234 A1 2345  
    */
      

  3.   

    看了过客的方法后我重新去看我那个,好像我是有点理解错了。
    我把楼主的要求看成:分隔数中必须带有一个数字:4你可以用过客那个,或者把我那个的代码修改一下:
    string pattern = @"(\d{2}){2,}|.+?(?=(\d{2}){2,}(?!\d))";
      

  4.   

    又仔细看了下,发现是被前一帖“字符串从后向前,截取数字”的描述误导了,用了RegexOptions.RightToLeft模式
    而楼主的测试用例明显考虑不周全string[] test = new string[] { "A1234", "A12345", "123A123456", "1A1234567", "12A12A2345", "A1234A12345", "12345A12345A12345", "12ABCE12A" };
    Regex reg = new Regex(@"(\d{4}(?:\d{2})*)(?!\d(?:\d{2})*$)");
    foreach (string src in test)
    {
         richTextBox2.Text += src.PadRight(18, ' ') + "->  ";
         foreach (string s in reg.Split(src))
         {
              richTextBox2.Text += s + " ";
         }
         richTextBox2.Text += "\n";
    }/*---------输出-----------
    A1234             ->  A 1234  
    A12345            ->  A1 2345  
    123A123456        ->  123A 123456  
    1A1234567         ->  1A1 234567  
    12A12A2345        ->  12A12A 2345  
    A1234A12345       ->  A 1234 A1 2345  
    12345A12345A12345 ->   1234 5A 1234 5A1 2345  
    12ABCE12A         ->  12ABCE12A 
    *///如果要求输出结果是这样的
    12345A12345A12345 ->   1234 5A1 2345 A1 2345
    //则正则替换为
    Regex reg = new Regex(@"^(\d{4}(?:\d{2})*)|(\d{4}(?:\d{2})*)(?!\d(?:\d{2})*(?:\D|$))");不过用Split还有一个问题,就是开头或结尾符合分割条件时,会各多出一个空项来,需要处理一下,这里没做判断