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

4

2 回答 2

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

(不确定您是否也尝试将 in 分开'a-b''a\nb'

于 2013-10-09T15:36:59.723 回答
0

你必须使用函数替换来做你想做的事:

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

我的一般理念是“当你可以轻松地用两个实现目标时,为什么要努力制作一个超级正则表达式?” 在这种情况下,我们匹配更大的字符串(“ab,cd,ef”),然后匹配各个对并进行替换。

在不了解问题的更大背景的情况下,很难说,但似乎您可以通过拆分和重新加入以不那么复杂的方式实现目标:

var parts = s.split( '%' );
var result = [ parts[0] ].concat( parts[1].split( /[,-]/ ) ).join( '\n' );
于 2013-10-09T15:27:46.030 回答