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

find a single occurrence of a string, then multiple matches of another pattern

本文关键字:查找 模式 字符串 单个匹 然后 另一个      更新时间:2023-09-26

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

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

成功匹配字符串,但我似乎无法重复替换单词对。

捷轩

您必须使用函数替换来执行所需的操作:

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' );

如果你的字符串总是用逗号/百分比描绘,你可以这样做:

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);

捷轩

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