再来个直接替换的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 */
多谢楼上诸位鄙人自己也解决了。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下不可用, 而且我确实看不懂。 (?<= 这里这个 < 是干嘛的? 怎么讲?? 先不结贴 继续等回答 但是这个
本帖最后由 lxcnn 于 2010-04-26 13:41:32 编辑
哦,有嵌套的话,倒也不用平衡组,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 */
Regex re = new Regex("(?<=\(+[^)]+)@");
string result = re.Replace(str.Replace(",","@"),",");
手写的,没测试
int intPlace = strTemp.LastIndexOf(',');
strTemp = strTemp.Remove(intPlace, 1);
strTemp = strTemp.Insert(intPlace,"@");
Regex reg = new Regex(@"(?n)(?<=(^|\))([^(),]*,)*[^(),]*),");
string result = reg.Replace(test, "@");
/*-------输出-------
a@b@c(arg1,arg2,"vla1,val2")@d
*/
Regex reg = new Regex(@"([\w_\-]+(?:\(.*\))?\s*),");
string result = reg.Replace(test, "$1@");5楼高人给的正则在C#下确实可用,但是在js下不可用, 而且我确实看不懂。
(?<= 这里这个 < 是干嘛的? 怎么讲?? 先不结贴 继续等回答
但是这个
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
*/
Regex reg = new Regex(@"(?n)(?<=(^|\))([^(),]*,)*[^(),]*),");写正则首先就是要分析规律
要替换的内容是字符“,”,那就找一下它的规律
a,
a,b,
a,b,c(arg1,arg2,"vla1,val2"), 可以简化为 ),
当然可以补充第四种情况 ),d,
可以看到,要替换的就是以上三种情况尾部的“,”
因为使用逆序环视,要找一个参照物,根据楼主的需求,这里能确定的参照物就是开始位置“^”和字符“)”
第一种情况向左搜索,是一直要搜索到字符串开始位置的,所以就是:(?<=^a),,抽象一下就是:(?<=^[^()]*),
第二种情况向左搜索,也是一直要搜索到字符串开始位置的,但它是从第一个“,”后面的位置开始搜索的,所以就是:(?<=^a,b),,抽象一下就是(?<=^([^(),]*,)*[^(),]*),
第三种情况向左搜索,它只需要搜索到字符“)”,其实也就是:(?<=\)),,抽象一下并且考虑复杂一点的如第四种情况就是:(?<=(^|\))([^(),]*,)*[^(),]*),
综合起来,也就是上面的正则了