想写个成生自定义格式字符串比如<a href="axxx.aspx?id=${id}$" title="${title}$">${title:cut20}$</a>
我想要处理成 <a href="axxx.aspx?id={0}" title="{1}">{2:cut20}</a>正则我写出来了\$\{(?<field>[^:}]+)(?<format>(?:\:[^}]*)?)?\}\$但是应该怎么去替换呢?   public static string CreateHTML(string strFormat, DataTable dt)
    { string regExp = @"\$\{(?<field>[^:}]+)(?<format>(?:\:[^}]*)?)?\}\$";
        MatchCollection matchs = Regex.Matches(strFormat, regExp);
        string formatString =string.Empty;
        object[] arges =new object[matchs.Count];
        int i = 0;
        foreach (Match m in matchs)
        {
            strFormat = Regex.Replace(strFormat, regExp, "{" + i + m.Groups["format"] + "}");
            ++i;
        }
          return strFormat;}这样我输进去<a href="axxx.aspx?id=${id}$" title="${title}$">${title:cut20}$</a>他给我换成了<a href="axxx.aspx?id={0}" title="{0}">{0}</a>...
用正则委托?但是正则委托怎么让{0}做一个自增呢???望高手指教再问一个嘿嘿比如我现在要拿到所有链接中class='xxxx'的无素的href属性(注:class的位置有可能在href左边也可能在右边一条正则能搞定吗?比如<a href="xxxx.aspx" class="xxxx">或者
<a class="xxxx" href="xxxx.aspx">这两种情况怎么用一条正则搞定?望指教!

解决方案 »

  1.   

    <a\s(?:[^>]*class='xxxx'[^>]*href=(['"]?)(?<href>[^'"\s]*)\1|[^>]*href=(['"]?)(?<href>[^'"\s]*)\2[^>]*class='xxxx')[^>]*>
    不知道第二个问题这样解决可以吗?这样的话就定义了两个同名的group了不知道遇上第二种问题时候的解题思路应该是怎么样的,望指教!
      

  2.   

    一条正则能搞定吗?比如<a href="xxxx.aspx" class="xxxx">或者
    <a class="xxxx" href="xxxx.aspx">这两种情况怎么用一条正则搞定?
    一条语句没有办法判断吧,除非中间用|分开两个,那实际也是两个了
      

  3.   

    第二个问题没必要那样写,你关心的只是两个特征
    1、a标签
    2、是否包含class='xxxx'
    所以这样写就可以了
    <a[^>]*class="xxxx"[^>]*>
    至于第一个问题,没太看明白,是每次都处理
    <a href="axxx.aspx?id=${id}$" title="${title}$">${title:cut20}$</a>
    这样一个字符串吗
    那么替换后的0、1、2是根据什么来的,固定的,还是有一个依据,从左到右要替换的三个按顺序加1就可以了吗
      

  4.   

    哦,原来第二个问题是要提取href属性,有两种办法,一是一条语句,这样效率会差些,二是用<a[^>]*class="xxxx"[^>]*>加委托来提取,==,我写下代码
      

  5.   

    从左到右替换,每次加1也就是要实现一个string.format的功能,不过我把参数直接指定的str里面了第二个问题你那样写怎么能拿得到href属性?你的意思是先拿到所有class='xxxx'的link,然后再去拿他的href是吗?
      

  6.   

    这样,把class='xxxx'作为条件,而不是内容判断一下就可以了,这样不会有什么性能损失,所以也就不用写委托的方法了
    string yourStr = ...............;
    MatchCollection mc = Regex.Matches(yourStr, @"<a(?=[^>]*class=""xxxx""[^>]*>)[^>]*href=(['""])(?<url>[^'""\s>]*)\1[^>]*>", RegexOptions.IgnoreCase);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Groups["url"].Value + "\n";
    }
      

  7.   

    (?=[^>]*class='xxxx'[^>]*>)这一句相当于匹配a后面跟的第一个字符(\s)他后面是否包含class='xxxx'是吧?
    多谢指教
      

  8.   

    看看这样是不是你要的public static string CreateHTML(string strFormat, DataTable dt)
    {
        return strFormat = Regex.Replace(strFormat, @"\$\{(?<field>[^:}]+)(?<format>(?:\:[^}]*)?)?\}\$", new MatchEvaluator(regReplace), RegexOptions.IgnoreCase);        
    }static int i = -1;
    private static  string regReplace(Match m)
    {
        i++;
        return "{"+i + m.Groups["format"].Value + "}";
    }不知道DataTable dt这个参数是用来做什么的,没见到你用,这里保留了,但是没用上调用
    string yourStr = ..........;
    richTextBox2.Text = CreateHTML(yourStr, null);
      

  9.   

    这里多写了点东西,改下吧public static string CreateHTML(string strFormat, DataTable dt)
    {
        return Regex.Replace(strFormat, @"\$\{(?<field>[^:}]+)(?<format>(?:\:[^}]*)?)?\}\$", new MatchEvaluator(regReplace), RegexOptions.IgnoreCase);        
    }
      

  10.   

    嗯,如果外部用个i的话就要实例化这个对象然后再调用方法了因为asp.net要考虑一个并发多谢你的指教