比如有一字符串
sBody=a,<bZX>,c,<ddd>,d,,<e>,...我现在想把<bZX>替换成xxx,
如果用
pattern="<[\w]*>";
Regex.Replace(sBody,pattern,"xxx",RegexOptions.IgnoreCase);
就把后面的也替换了,如何只替换第一个?
先谢谢.

解决方案 »

  1.   

    Regex.Replace 方法 (String, String, Int32) 
    从输入字符串中的第一个字符开始,用指定的替换字符串替换由 Regex 构造函数中指定的正则表达式定义的指定数目的模式匹配项。 
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 最新版本:20070212http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  2.   

    多谢feiyun0112.但你这方法我弄不太明白,比如这三个参数哪个是sBody?另外我查了下Replace帮助,4个重载里没有Regex.Replace(String, String, Int32)写法.
      

  3.   

    首先楼主要明确一点,那就是在字符串
    sBody="a,<bZX>,c,<ddd>,d,,<e>,..."
    当中,<bZX>与其它相似字符例如<ddd>,<e>如何区分楼主所写正则<[\w]*>可以匹配任何以“<”开头,“>”结束,中间是字母的字符串,当然会替换所有了
      

  4.   

    楼主的Regex.Replace用的没问题,只是正则写的有问题而已,需要先明确你的需求如果替换固定的<bZX>字符串,直接用string的Replace方法就是了,如果不是固定的,说下特征,如何与其它字符串区分
      

  5.   

    string nameStr="a,<bZX>,c,<ddd>,d,,<e>";
    System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^[^<^>]*(<[^<^>.]*>)");
    if(regex.IsMatch(nameStr))
    {
    System.Text.RegularExpressions.Match match = regex.Match(nameStr, 0);
    if(match.Groups.Count > 1)
    {
    nameStr = nameStr.Replace(match.Groups[1].Value, "***");
    }
    }
      

  6.   

    可能我没说清楚.
    我其实现在想替换的是以“<”开头,“>”结束的,出现的第一个字符串.其他的仍然保留.
    当然用其他方式也能解决,我只想通过正则实现.
      

  7.   

    try..string str = "sBody=a,<bZX>,c,<ddd>,d,,<e>";
                if (Regex .IsMatch (str ,"<\\w+>"))
                {
                    str = str.Replace(Regex.Match(str, "<\\w+>").Groups[0].Value, "xxx");
                }
      

  8.   

    string sBody="a,<bZX>,c,<bZX>,<ddd>,d,,<e>,...";            string pattern=@"<[\w]*>";
                
                Regex reg=new Regex(pattern,RegexOptions.IgnoreCase);
                
                MessageBox.Show( reg.Replace(sBody,"xxx",1));
      

  9.   

    string sBody="a,<bZX>,c,<ddd>,d,,<e>,...";
    Regex reg=new Regex(@"<[\w]*>");
    sBody=sBody.Replace(reg.Match(sBody).Value,"xxx");
    //要利用其匹配结果的特性
      

  10.   

    输出:sBody=a,xxx,c,<ddd>,d,,<e>
      

  11.   

    试下string pattern=@"(?<![\s\S]*?<[^>]*?>[\s\S]*?)<[^>]*?>";
      

  12.   

    经过测试liujia_0421的方法,通过,非常感谢其他朋友的解答,稍后学习各位其他方法,结贴!
      

  13.   

    hehe 还不能结,想没想过 只替换第二个 怎么弄?
    "a,<bZX>,c,<bZX>,d,<bZX>,e,<bZX>,...";" 特别是这样的串
      

  14.   

    不能结的 原因是因为 只有feiyun0112 给出的答案才是正确的
    "a,<bZX>,c,<bZX>,d,<bZX>,e,<bZX>,...";"  用这个试下
      

  15.   

    cancerser兄,我写的也是可以的string yourStr = "a,<bZX>,c,<bZX>,d,<bZX>,e,<bZX>,...";
    string pattern = @"(?<![\s\S]*?<[^>]*?>[\s\S]*?)<[^>]*?>"; 
    string resultStr = Regex.Replace(yourStr, pattern, "xxx", RegexOptions.IgnoreCase);
    替换第n个,没有做,说下我现在想到的比较通用的方法吧先用正则把包含前n-1个的截取出来,放入sub1里,后面的放sub2里,然后对sub2做如上方法替换掉第一个,再su1+sub2就可以了,可能效率不高,有空再想想吧
      

  16.   

    to  lxcnn(过客) ( )
    不用的 呵呵 我给你写个你 看看
    string sBody="a,<bZX>,c,<bZX>,d,,<e>,...";
    MatchCollection mc= Regex.Matches(sBody,@"<[\w]*>");
    Match m= mc[1];//替换第二个
    sBody=new Regex(m.Value).Replace(sBody,"xxx",1,m.Index);
    //能看明白我的意图吧
      

  17.   

    to cancerser
    了解,又学到一着,头脑不灵活,呵呵
      

  18.   

    刚才把各位的方法仔细看了下,感觉feiyun0112的方法最好.呵.这里的高人就是多.
      

  19.   

    pattern= "(<\w+>)*?";
    Regex.Replace(sBody,pattern, "xxx ",RegexOptions.IgnoreCase); 
      

  20.   


    pattern= "(<\w+>)+?";
    Regex.Replace(sBody,pattern, "xxx ",RegexOptions.IgnoreCase);