2013-10-09 72 views
0

是否可以匹配某個字符串一次,然後多次匹配一個字符串模式的多次出現,用它自己替換每個字符串並附加其他值(例如,越線)?找到一個字符串的單個匹配項,然後匹配另一個匹配項的多個匹配項

<!--HTML--> 
<textarea id="i"></textarea> 

JS

var s = "some-string-to-begin%a-b,c-d,e-f"; 

var re = /^(.*?)%(((\w+)\-(\w+)),?)*/g; 

console.log(s.match(re)); //matches the whole string 

var res = s.replace(re, "$1\n$2\n$3\n$4\n$5"); 

$("#i").val(res) 

HTML:

<textarea> 
some-string-to-begin 
e-f 
e-f 
e 
f 
</textarea> 

成功匹配字符串,但我似乎無法得到重複替換詞的對。

JSBIN

回答

0

你必須使用一個函數替代做你想要什麼:

s.replace(/^(.*?)%(.*)/, function(s,a,b) { 
    return a + '\n' + b.replace(/(\w+)-(\w+),?/g, '$1\n$2\n'); 
}); 

我總的理念是「爲什麼你的頭髮拉出來試圖讓一個尤伯杯正則表達式時,可以用兩個輕鬆實現你的目標?「在這種情況下,我們匹配較大的字符串(「a-b,c-d,e-f」),然後匹配各個對並進行替換。

不知道你的問題的更大的背景下,這很難說,但好像你可以通過拆分和重新加入實現在一個不太複雜的方式你的目標:

var parts = s.split('%'); 
var result = [ parts[0] ].concat(parts[1].split(/[,-]/)).join('\n'); 
0

如果你的字符串始終逗號/百分比界定,你可以做這樣的事情:

var s = "some-string-to-begin%a-b,c-d,e-f", 
    replacement = s.split(/[%,]/g).join('\n'); // split by % or , and then join by linebreak 
$("#i").val(replacement); 

JSBIN

(不知道你還tryi ng以將'a-b'分離爲'a\nb'。)

相關問題