如何匹配分隔符之间出现但与分隔符本身不匹配的文本?
文字
DoNotFindMe('DoNotFindMe')
DoNotFindMe(FindMe)
DoNotFindMe(FindMe,FindMe)
DoNotFindMe(FindMe,FindMe,FindMe)
脚本
text = text.replace(/[\(,]([a-zA-Z]*)[,\)]/g, function(item) {
return "'" + item + "'";
});
预期结果
DoNotFindMe('DoNotFindMe')
DoNotFindMe('FindMe')
DoNotFindMe('FindMe','FindMe')
DoNotFindMe('FindMe','FindMe','FindMe')
答案 0 :(得分:2)
您可以使用:
var s = "DoNotFindMe('DoNotFindMe')\nDoNotFindMe(FindMe)\nDoNotFindMe(FindMe,FindMe)\nDoNotFindMe(FindMe,FindMe,FindMe)";
var r = s.replace(/(\([^)]+\))/g, function($0, $1) {
return $1.replace(/(\b[a-z]+(?=[,)]))/gi, "'$1'"); }, s);
DoNotFindMe('DoNotFindMe')
DoNotFindMe('FindMe')
DoNotFindMe('FindMe','FindMe')
DoNotFindMe('FindMe','FindMe','FindMe')
答案 1 :(得分:2)
这是一个非常简单的方法:
([a-zA-Z]+)(?=,|\))
这会查找以逗号或近括号结尾的任何单词。
var s = "DoNotFindMe('DoNotFindMe')\nDoNotFindMe(FindMe)\nDoNotFindMe(FindMe,FindMe)\nDoNotFindMe(FindMe,FindMe,FindMe)";
var r = s.replace(/([a-zA-Z]+)(?=,|\))/g, "'$1'" );
alert(r);

使用与其他两个答案相同的测试代码;谢谢!
答案 2 :(得分:1)
这是一个避免函数参数的解决方案。它有点不稳定,但有效。基本上,您明确匹配左分隔符并通过反向引用将其包含在替换字符串中,因此它不会被删除,但是您必须对正确的分隔符使用正向前瞻声明,否则匹配指针将被移动到正确的分隔符之前,以便下一场比赛,因此它不能将该分隔符作为以下分隔词的左分隔符匹配:
var s = "DoNotFindMe('DoNotFindMe')\nDoNotFindMe(FindMe)\nDoNotFindMe(FindMe,FindMe)\nDoNotFindMe(FindMe,FindMe,FindMe)";
var r = s.replace(/([,(])([a-zA-Z]*)(?=[,)])/g, "$1'$2'" );
alert(r);
结果
DoNotFindMe('DoNotFindMe')
DoNotFindMe('FindMe')
DoNotFindMe('FindMe','FindMe')
DoNotFindMe('FindMe','FindMe','FindMe')
(感谢anubhava,我偷了你的代码模板,因为它非常适合我的测试!我给了你一个upvote吧。)