2014-12-05 86 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