字符串内容 如下所示:a,b,c(arg1,arg2,"vla1,val2"),d现求一正则表达式,可以将每项结尾的逗号替换成@,项目内部的内容包括逗号都不理会就是 替换结果应该是如下:
a@b@c(arg1,arg2,"vla1,val2")@d

解决方案 »

  1.   

    string str=@"a,b,c(arg1,arg2,""vla1,val2""),d";
    Regex re = new Regex("(?<=\(+[^)]+)@");
    string result = re.Replace(str.Replace(",","@"),",");
    手写的,没测试
      

  2.   

    不用正则也是很简单实现的              string strTemp="a,b,c(arg1,arg2,\"vla1,val2\"),d";
                int intPlace = strTemp.LastIndexOf(',');
                strTemp = strTemp.Remove(intPlace, 1);
                strTemp = strTemp.Insert(intPlace,"@");
      

  3.   

    本帖最后由 lxcnn 于 2010-04-26 13:11:26 编辑
      

  4.   

    再来个直接替换的string test = "a,b,c(arg1,arg2,\"vla1,val2\"),d";
    Regex reg = new Regex(@"(?n)(?<=(^|\))([^(),]*,)*[^(),]*),");
    string result = reg.Replace(test, "@");
    /*-------输出-------
    a@b@c(arg1,arg2,"vla1,val2")@d
    */
      

  5.   

    多谢楼上诸位鄙人自己也解决了。string test = "a , b , c(arg1,arg2, arg3(subArg1, "subArgVal"),\"vla1,val2\"), d";
    Regex reg = new Regex(@"([\w_\-]+(?:\(.*\))?\s*),");
    string result = reg.Replace(test, "$1@");5楼高人给的正则在C#下确实可用,但是在js下不可用, 而且我确实看不懂。 
     (?<=  这里这个 < 是干嘛的?  怎么讲?? 先不结贴  继续等回答
    但是这个
      

  6.   

    本帖最后由 lxcnn 于 2010-04-26 13:41:32 编辑
      

  7.   

    哦,有嵌套的话,倒也不用平衡组,9楼的委托是满足需求的
    string test = "a , b , c(arg1,arg2, arg3(subArg1, \"subArgVal\"),\"vla1,val2\"), d, e(arg1, arg2), f";
    Regex reg = new Regex(@"(^|\))[^()]+(\(|$)");
    string result = reg.Replace(test, delegate(Match m) { return m.Value.Replace(",", "@"); });那这样js中倒是也可以用正则处理
    <script type="text/javascript">    
        var str = "a , b , c(arg1,arg2, arg3(subArg1, \"subArgVal\"),\"vla1,val2\"), d, e(arg1, arg2), f";
        var reg = /(^|\))[^()]+(\(|$)/g;
        var result = str.replace(reg, function($0){return $0.replace(/,/g, "@");});
        document.write(result);
    </script>/*-----以上两种方式输出都是------
    a @ b @ c(arg1,arg2, arg3(subArg1, "subArgVal"),"vla1,val2")@ d@ e(arg1, arg2)@ f
    */
      

  8.   

    js不支持 逆序环视 吗?我知道js支持 正向预查(?=pattern),如果不支持的话就没辙了。 我需要的是C#正则,不过我自己测试是用js测试的而已, 所以有此一问。对于你提出我的正则的问题, 测试了一下, 确实存在。  多谢提醒。 我还是考虑不周。
      

  9.   

    js不支持逆序环视C#和js两种实现方式都已在14楼给出
      

  10.   


    Regex reg = new Regex(@"(?n)(?<=(^|\))([^(),]*,)*[^(),]*),");写正则首先就是要分析规律
    要替换的内容是字符“,”,那就找一下它的规律
    a,
    a,b,
    a,b,c(arg1,arg2,"vla1,val2"), 可以简化为 ),
    当然可以补充第四种情况  ),d,
    可以看到,要替换的就是以上三种情况尾部的“,”
    因为使用逆序环视,要找一个参照物,根据楼主的需求,这里能确定的参照物就是开始位置“^”和字符“)”
    第一种情况向左搜索,是一直要搜索到字符串开始位置的,所以就是:(?<=^a),,抽象一下就是:(?<=^[^()]*),
    第二种情况向左搜索,也是一直要搜索到字符串开始位置的,但它是从第一个“,”后面的位置开始搜索的,所以就是:(?<=^a,b),,抽象一下就是(?<=^([^(),]*,)*[^(),]*),
    第三种情况向左搜索,它只需要搜索到字符“)”,其实也就是:(?<=\)),,抽象一下并且考虑复杂一点的如第四种情况就是:(?<=(^|\))([^(),]*,)*[^(),]*),
    综合起来,也就是上面的正则了