2013-10-09 41 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'。)

相关问题