找到一个字符串,然后找到另一个模式的多个匹配项

时间:2013-10-09 15:19:40

标签: javascript regex

是否可以匹配某个字符串一次,然后多次出现一个字符串模式,用自己替换每个字符串,附加另一个值(例如,换行符)?

<!--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

2 个答案:

答案 0 :(得分: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' );

答案 1 :(得分: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

(不确定您是否也尝试将'a-b'分隔为'a\nb'。)