2014-12-05 39 views
1

如何匹配分隔符之间出现的文本,但不匹配分隔符本身?RegEx与逗号分隔列表中的词匹配

文本

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') 

https://regex101.com/r/tB1nE2/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);

采用同样的测试码作为其他两个答案;谢谢!

+0

这是利用了这个事实,或者)将永远不会发生在一个(。Right? – wizulus 2014-12-05 22:51:33

+0

右边,所以它不会匹配DoNotFindMe('。:) – Purag 2014-12-05 22:52:08

+1

并且谢谢你的一个好问题...我有挖掘我的RegEx知识,我有一段时间没有使用......花了一点时间才得到这个简单的哈哈。 – Purag 2014-12-05 22:52:48

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

下面是避免函数参数的解决方案。这有点won but,但工作。基本上,你明确地匹配左边的分隔符,并通过反向引用将它包含在替换字符串中,这样它就不会被删除,但是你必须对正确的分隔符使用肯定的先行判断,否则匹配指针会被移动未来正确的分隔符,为下一场的,所以它然后将不能够到分隔符为以下分隔符字的左定界符匹配:

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,我偷了你的代码模板,因为它对我的测试来说是完美的!我给了你一个赞成。)

+0

啊我不知道如何做一个'积极的前瞻断言'。谢谢! – wizulus 2014-12-05 22:48:23