第一种情况:  <font color="#ff0000"><b>祖国祖国我爱你!2009年5月4日</b></font>
 如取前5个字符,变成:<font color="#ff0000"><b>祖国祖国我...</b></font>
 怎么写啊?
 privite string myStrFunction(string str,int n)
{
  //这里怎么写啊?看似简单,但我不会啊!只知道要用正则表达式.
 }第二种情况:
<font color="#ff0000"><b>祖国祖国我爱你!2009年5月4日</b><u>其它字符</u></font>
  如果取前19个字符,变成:<font color="#ff0000"><b>祖国祖国我爱你!2009年5月4日</b><u>其它...</u></font>
  怎么写?
 privite string myStrFunction(string str,int n)
{
  //查了好多的资料都没有搞定,求兄弟姐妹们帮忙啊! }

解决方案 »

  1.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Text.RegularExpressions;
    namespace test
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {            string source = @"<font color=""#ff0000""> <b>祖国祖国我爱你!2009年5月4日 </b> </font> ";
                        
                Regex rx=new Regex(@".*\<b\>");
                string head=rx.Match(source).ToString();
                rx=new Regex(@"(?<=<b>).*(?=</b>)");
                string mid = rx.Match(source).ToString();
                rx = new Regex(@"</b>.*");
                string last = rx.Match(source).ToString();
                mid = mid.Substring(0, 5) + "...";
                MessageBox.Show(head + mid + last);
            }
            private string myStrFunction(string str,int n) 
            { 
                string source=str;
                Regex rx=new Regex(@".*\<b\>");
                string head=rx.Match(source).ToString();
                rx=new Regex(@"(?<=<b>).*(?=</b>)");
                string mid = rx.Match(source).ToString();
                rx = new Regex(@"</b>.*");
                string last = rx.Match(source).ToString();
                mid = mid.Substring(0, n) + "...";
                return head + mid + last;
            } 
            private string myStrFunction2(string str,int n) 
            {
                string source = str;
                Regex rx = new Regex(@".*\<u\>");
                string head = rx.Match(source).ToString();
                rx = new Regex(@"(?<=<u>).*(?=</u>)");
                string mid = rx.Match(source).ToString();
                rx = new Regex(@"</u>.*");
                string last = rx.Match(source).ToString();
                mid = mid.Substring(0, n) + "...";
                return head + mid + last;        }    }
    }
      

  2.   

    满足你目前的需求,但不是很严谨,一些异常情况的判断没有加,改天有时间写一个严谨点的吧private string getSubString(string src, int len)
    {
        StringBuilder result = new StringBuilder(1024);
        Regex reg = new Regex(@"(^|[^<>]+)((?:<[^>]*>)*)");
        Match m = reg.Match(src);
        int vLen = 0;
        while(m.Success)
        {
            vLen = m.Groups[1].Value.Length;
            if (vLen < len)
            {
                result.Append(m.Groups[1].Value);
                len -= vLen;
            }
            else
            {
                result.Append(m.Groups[1].Value.Substring(0, len));
                len = 0;
            }
            if (len == 0)
            {
                result.Append("..." + m.Groups[2].Value);
                return result.ToString();
            }
            else
            {
                result.Append(m.Groups[2].Value);
            }
            m = m.NextMatch();
        }
        return "";
    }
      

  3.   


    有一个严重的问题:当所取的长度len 大于 内容长度时,返回值为空,因为没有用过正则表达式,我没法修改.请再帮我改一下,好不好?
      

  4.   

    自摸索,小BUG修改了
    最后一行改为 return src;搞定,结帖,给分.
      

  5.   

    嗯,自己没有这样用过,所以场景考虑不全,修改了一下,就目前的用例来说,已解决第一个字符丢失的问题,楼主可以试下,哪里不符合要求,给个例子,我再改下吧private string getSubString(string src, int len)
    {
        StringBuilder result = new StringBuilder(1024);
        Regex reg = new Regex(@"(^?[^<>]*)((?:<[^>]*>)*)");
        Match m = reg.Match(src);
        int vLen = 0;
        while(m.Success)
        {
            vLen = m.Groups[1].Value.Length;
            if (vLen < len)
            {
                result.Append(m.Groups[1].Value);
                len -= vLen;
            }
            else
            {
                result.Append(m.Groups[1].Value.Substring(0, len));
                len = 0;
            }
            if (len == 0)
            {
                result.Append("..." + m.Groups[2].Value);
                return result.ToString();
            }
            else
            {
                result.Append(m.Groups[2].Value);
            }
            m = m.NextMatch();
        }
        return src;
    }
      

  6.   

    再次感谢热心肠的lxcnn兄,我再测试一下.
      

  7.   

    现在不丢失第一个字符了,但是还有一个小问题:getSubString("中华人民共和国",7)正确的结果是"中华人民共和国"而现在的结果是"中华人民共和国...",我不知从哪里解决.
      

  8.   

    现在不丢失第一个字符了,但是还有一个小问题:getSubString("中华人民共和国",7)正确的结果是"中华人民共和国"而现在的结果是"中华人民共和国...",我不知从哪里解决.-----------------------------------------
    呵呵,持续改进,楼主继续测试private string getSubString(string src, int len)
    {
        StringBuilder result = new StringBuilder(1024);
        Regex reg = new Regex(@"(^?[^<>]*)((?:<[^>]*>)*)");
        Match m = reg.Match(src);
        int vLen = 0;
        while(m.Success)
        {
            vLen = m.Groups[1].Value.Length;
            if (vLen < len)
            {
                result.Append(m.Groups[1].Value);
                len -= vLen;
            }
            else
            {
                result.Append(m.Groups[1].Value.Substring(0, len));
                len = 0;
            }
            if (len == 0)
            {
                if (result.ToString() + m.Groups[2].Value == src)
                {
                    return src;
                }
                else
                {
                    result.Append("..." + m.Groups[2].Value);
                    return result.ToString();
                }
            }
            else
            {
                result.Append(m.Groups[2].Value);
            }
            m = m.NextMatch();
        }
        return src;
    }
      

  9.   


    在我这测试,getSubString("中华人民共和国",7)的返回结果是"中华人民共和国" 啊